Häufig ist der Grund Nebenläufigkeit (s. "Heisenbug" von der heisenberg'schen Unschärferelation). Da viele Programme (und auch Programme in sich selbst) in mehreren, quasi-unabhängigen Strängen verlaufen, kann bei unsauberer Programmierung daraus viel merkwürdiges entstehen. Ein Beispiel dafür sind deadlocks (zwei Stränge warten gegenseitig auf ein Ergebnis und hängen). Weitere Probleme kommen aus race conditions, also einer schlechten Synchronisierung von Daten die hin- und her gereicht werden.

Ausserdem ist die "richtige" Behandlung von Fehlern gar nicht so einfach. Das heisst, z.B. kann ein Programm in einen inkonsistenten Zustand kommen, wenn bestimmte Interna die aufgetretenen Fehler nicht richtig weiterkommunizieren. Ein Fehler kann z.B. sein, dass man Daten von einer TCP Internet-Verbindung lesen möchte, dort aber noch keine/nicht genügend Daten vorhanden sind. Der Fehler wird zwar von einem Betriebssystem an die Software übergeben, diese ignoriert aber beispielsweise diesen "Spezialfall".

...zur Antwort

Also dafür würde ich fast zweigleisig fahren. Für ein C/C++ Projekt empfehle ich Doxygen: das Tool extrahiert Typen, Namespaces, Funktionen, etc. (zusammen mit speziell formatierten Kommentaren) aus dem Quellcode und kann daraus verlinkte Beschreibungen in HTML und LaTeX, etc. generieren. Für Java gibt es JavaDoc.

Eine Dokumentation der Architektur/des abstrakten Designs kann man zusätzlich anfertigen. Das geht mit LaTeX, Visio oder mit professionelleren Tools wie Enterprise Architect (u.A. Sehr gut für UML). Insgesamt sollte man dafür Grumdkenntnisse in UML haben.

...zur Antwort

Das zeigt Dir die Bildschormauflösung und Wiederholfrequenz an. Eine Videoauflösung von 1080p heisst, 1920x1080 Pixel (Breite x Höhe), p steht für progressive im Vergleich zu interlaced (1080i). 60 Hz heisst bei progressive, dass Du 60 Vollbilder pro Sekunde siehst, bei interlaced sind es 30 Voll- bzw. 60 Halbbilder. Dies ist quasi die Qualität der Auflösung. Interlaced hat bei jeder zweiten Pixelreihe "Fransen", wenn z.B. die Kamera schnell schwenkt.

...zur Antwort
C++ DLL Problem

Ich versuche seit geraumer Zeit eine DLL in C++ dynamisch zur Laufzeit zu laden. Das Laden an sich ist kein Problem, jedoch der Funktionsaufruf selber. Ich poste hier mal den Code der DLL und des Aufrufenden Programms:

DLL:

#define TEST_API_E __declspec(dllexport)
#include <Windows.h>
#include <iostream>


BOOL APIENTRY DllMain(HMODULE hModule,
    DWORD dwReasonForCall,
    LPVOID pReserved)
{
    switch (dwReasonForCall)
    {
    case DLL_PROCESS_ATTACH:
        std::cout << "Ich wurde geladen!\n";
        break;
    case DLL_PROCESS_DETACH:
        break;
    }

    return TRUE;
}

void TEST_API_E Message(int a) {
    std::cout << "Irgend eine Nachricht!\n\n" << "Übergebener Parameter: " << a << std::endl;
}

Und das Programm das die DLL Lädt:

#include <Windows.h>
#include <iostream>

typedef void (CALLBACK* DLLFunction)(int);

HMODULE hDLL;
DLLFunction dllFunc;

int main() {
    hDLL = LoadLibrary(TEXT("TestDLL.dll"));
    if (hDLL != nullptr) {
        dllFunc = (DLLFunction)(GetProcAddress(hDLL, "Message"));
        if (dllFunc != nullptr) {
            dllFunc(123);
            system("PAUSE");
            return 0;
        }
        else {
            std::cout << "Fehler beim Funktionsaufruf!\n";
            FreeLibrary(hDLL);
            system("PAUSE");
            return 1;
        }
    }
    else {
        std::cout << "Fehler beim Laden der DLL!\n";
        system("PAUSE");
        return 1;
    }
}

Wenn ich die Anwendung starte, sagte mir der Debugger von Visual Studio Express 2013 das ein Zugriffsfehler beim Aufruf von "GetProcAddres" stattfindet.

Bei allen anderen Leuten und in vielen Foren die ich durchsucht habe Fubktioniert das ganz so einwandfrei. Was ist das Problem bei mir??

Vielen Dank schonmal für eure Hilfe!

...zum Beitrag

C++ Funktionsnamen unterliegen einem sogenannten Name-Mangling. Das heisst, das Symbol, das in der DLL auftaucht wird mit Zusatzinformationen ausgestattet (z.B. um Funktionsüberladungen mit unterschiedlichen Parametern zuzulassen oder für die Unterstützung von Namespaces). Das sind Features die C nicht anbietet. Wenn Du Deine "Message()" Funktion innerhalb von

extern "C" { /* hier */ }

Deklarierst, dann solltest Du die Message Funktion mit GetProcAddress() auflösen können.

...zur Antwort

Ich möchte noch hinzufügen, dass Du gar kein PHP erlernen brauchst. Da gibt es viele Alternativen. Zum Beispiel kannst Du mit NodeJS auf der Server-Seite in JavaScript programmieren. Aber Du wirst nicht drumherum kommen Dir einige Sachen anzueignen, um soetwas selbst umzusetzen. Da könntest Du z.B. Live-Updates mit Hilfe von WebSockets umsetzen ;)

Informiere Dich einfach ein wenig mehr über HTTP, HTML und die dazu notwendige Infrastruktur mit Client/Server.

...zur Antwort

C++ ist vollkommen in Ordnung kann aber frustrieren. Nicht mit C anfangen, da es Dir einen schlechten Stil mit C++ beibringt. Dafür den Schöpfer der Sprache konsultieren: Das Buch "The C++ Programming Language" von Bjarne Stroustup ist in der aktuellen Ausgabe zu empfehlen.

An sich ist Programmieren nicht so extrem von der Sprache abhängig - es kommt halt darauf an was Du am Schluss damit machen willst.

Wenn Du zum Beispiel viel Performance brauchst ist die Wahl richtig. Sonst kannst Du auch einfach JavaScript nehmen ;)

Im Ernst: Wenn Du mit C++ gut klar kommst ist der Rest eigentlich einfach erlernt - ist dann eigentlich nur Syntax und Dogmatik (letzteres sehr ausgeprägt bei Java).

...zur Antwort

Was hast Du denn bei der "Interpolation" gesetzt? None? Das würde es erklären. Cubic sollte Dir eine gute Qualität liefern.

...zur Antwort

Also dafür solltest Du Kenntnisse in der Programmiersprache Java haben. Die Klassen, die man dann für die eigentliche App-Entwicklung braucht, sind gut dokumentiert und sollten für jeden, der sich mit Java/Programmierung auskennt dann auch einfach einzusetzen sein.

Daher mein Tipp: Lerne zuerst Java. Setz Dich dann mit der Android API auseinander.

...zur Antwort

Jede Funktion bekommt eine oder mehrere Eingaben (das Funktionsargument) und berechnet daraus ein Resultat (Funktionswert). Dazu schreibt man das wie folgt:

quadriere(x) = x*x

Jetzt hast Du also beschrieben, was Deine "quadriere" Funktion mit dem Funktionsargument x machen soll. Du könntest auch eine Funktion "addiere" definieren:

addiere(x,y) = x+y

Nun stell Dir vor, Du kennst den Verbrauch eines Autos (z.B. 7 Liter auf 100 Kilometer), dann kannst Du eine Funktion

benzinverbrauch(x) = x / 100 * 7

definieren (wobei hier "x" die gefahrene Strecke in Kilometern ist). Der Benzinverbrauch auf 200 Kilometern wäre also:

benzinverbrauch(200) = 200 / 100 * 7 = 14

Natürlich kann man jetzt argumentieren, dass hier Gegenwind, Geschwindigkeit, etc. eine Rolle spielen.

Ich hoffe, das hilft Dir weiter.

...zur Antwort

Java hat für solche Aufgaben die java.lang.Runtime Klasse:

http://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html

Mit Hilfe des open Command-Line Tools kannst Du alle möglichen Mac OS X Programme aufrufen. Also im Terminal kannst Du unter Eingabe von

open -a Mail

das Mail-Programm öffnen.

man open

zeigt Dir an, was man mit dem open Befehl so alles machen kann.

Zurück zu Deiner Frage: Wenn Du einen Prozess starten möchtest nutzt Du die statische Methode exec aus der Runtime Klasse, also in Deinem Fall:

java.lang.Runtime.exec(new String[]{
    “/usr/bin/open�?,
    “-a�?,
    “Mail�?
});

.. oder so in der Art (meine Java Kenntnisse sind etwas eingerostet).

Du bekommst eine Referenz auf den erstellten Prozess (java.lang.Process) zurück - z.B. kannst Du mit waitFor() darauf warten, dass der Prozess ausgeführt wurde (ist im Falle des open Befehls aber etwas merkwürdig, da dies sehr schnell fertig ist - das eigentliche Programm wird separat gestartet.

Alles weitere solltest Du aus Oracle's JavaDoc entnehmen können.

...zur Antwort

Du solltest mal Mittelwert in Wikipedia eingeben. Deine Funktion für einen Mittelwert ist murks. Es ist eine statistische Größe, die Du wahrscheinlich als arithmetisches Mittel berechnen sollst. Du addierst alle Eingabewerte und teilst diese Summe durch die Anzahl der aeingaben.

...zur Antwort

Haben oder nicht haben... das ist hier die Frage! Also im Ernst: Internet haben ist etwas schwammig. Es gibt sicherlich (Betriebssystem-abhängige) APIs, die eine Art Internet-Konnektivitäts-Status zurückgeben. Soweit ich weiß gibt es in Java keine direkte Abstraktion dafür.

Allerdings ist das nicht weiter tragisch, da man das auch mit anderen Mitteln feststellen kann. Also wenn Du z.B. keine Namensauflösung (DNS Lookup) vornehmen kannst, dann ist Dein Internet zumindest nicht sonderlich nützlich - vielleicht reicht Dir das ja schon:

try {
    java.net.InetAddress.getByName("google.de");
    System.out.println("Du hast Internet"); 
} catch(java.net.UnknownHostException e) {
    System.out.println("Du hast KEIN Internet"); 
}

Ich habe allerdings vor einiger Zeit Java an den Nagel gehängt - vielleicht gibt es andere Möglichkeiten oder Änderungen seit Java 6 (daher die Antwort unter Vorbehalt) ;)

...zur Antwort

Ein einzelnes Buch hilft hier in der Regel nicht weiter.

Du brauchst eigentlich Informationen zu folgenden Themen:

  • Shader Programmierung (GPU Gems Serie oder Shader X Serie)
  • Rendering (z.B. Thomas Akenine-Möller: Real-Time Rendering)
  • Mathematik (z.B. Eric Lengyel: Mathematics for 3D Game Programming and Computer Graphics)
  • Physik (z.B. Christer Ericson: Real-Time Collision Detection)
  • Allgemeine Engine Architektur (z.B. Jason Gregory: Game Engine Architecture)
  • Weitere Tipps und Tricks (z.B. aus der Game Programming Gems Serie)

Ein einzelnes Buch, das sich z.B. auf DirectX spezialisiert wird Dir vielleicht ein paar Schritte weit helfen aber meine Erfahrung ist, dass diese nur an der Oberfläche kratzen und oft auch gar nicht die richtigen Themen beleuchten. Wenn Du wirklich coole 3D Welten erzeugen willst, dann ist die Frage, ob Du Direct3D oder OpenGL nutzt fast sekundär. Du musst auch wissen, was deine Computer-Architektur mit sich bringt (z.B. Optimierungen mit Hinsicht auf den Prozessor-Cache, SSE, AVX, etc.). Auch Tipps mit Hinsicht auf "Data Oriented Design" sind wichtig, viele "falsche" Tipps gießen Dir das ganze in eine merkwürdig komplexe OOP Klassenhierarchie... aber solcherlei Recherche wirst Du wahrscheinlich dann mit der Zeit anstellen.

Viel Erfolg! :)

...zur Antwort

Diese Art von Spiel ist "isometrisches 2D", eine Suche in Google brachte z.B. die folgende Seite im Zusammenhang mit "unity" hervor:

https://www.youtube.com/watch?v=kXhORqxfK_w

Ich persönliche habe nicht viel Erfahrung mit Unity, dafür aber schon einige Erfahrungen darin, Game-Engines mit C++ zu entwickeln. Wenn Du noch nicht viel Erfahrung mit so etwas hast solltest Du vielleicht bei Unity bleiben.

Willst Du das selbst entwickeln so werden Dich unter anderem folgende Probleme erwarten:

  • Ressourcen-/Speicher-Management (Bilder, Levels, etc. laden, alte/ungenutzte Ressourcen freigeben, optional "Streaming" d.h. das dynamische nach-/entladen von Daten)
  • Kenntnisse in einer Grafik API (z.B. OpenGL oder Direct3D) - Du willst sicherlich keinen Software-Renderer schreiben, da die vorhandenen Grafik-Pipelines Dir eine Menge Probleme abnehmen - leider kommst Du dann auch um Shader-Programmierung in GLSL oder HLSL nicht herum
  • User-Interface (Du musst sicherlich Text, Buttons, etc. darstellen und auch dementsprechend auf die Eingaben des Nutzers reagieren, z.B. welches Game-Objekt hat der Nutzer geclickt) - dazu passend:
  • Game Logik (häufig Scripting genannt obwohl Du das ohne Script direkt in C++ umsetzen kannst)
  • Sound-Effekte und (dynamische) Musik (z.B. mit OpenAL)
  • Die folgenden Dinge werden wohl bei dem Game keine große Rolle spielen: Physik, KI (Künstliche Intelligenz), Netzwerk/Multiplayer

Der Simple Direct Media Layer (SDL) ist eine Bibliothek (mit Zusatzbibliotheken wie SDL_Image), mit der Du vielleicht einige der Probleme umgehen kannst. Es bietet Dir auch einfache Möglichkeiten, 2D Layer in einem Compositing darzustellen aber ich bin mir nicht sicher, wie gut das für isometrische Perspektiven geeignet ist.

Viel Erfolg!

...zur Antwort

Vielleicht solltest Du mal schauen, welcher konkreter Fehler auftritt. SDL_GetError() gibt Dir einen String zurück, der Dir hoffentlich einen Hinweis geben sollte.

...zur Antwort

Also system() ruft einen Systembefehl auf. Ein PNG ist keine ausführbare Datei (im *nix-Bereich das eXecutable bit) - aus gutem Grund, denn ein PNG ist ein Bild und keine ausführbare Datei. Unter Mac OS X gibt es den Befehl "open". Also z.B.

system("/usr/bin/open -a Preview \"/Library/Desktop Pictures/Lion.jpg\"");

Genauere Informationen zum "open" Befehl bekommst Du im Terminal mit "man open".

...zur Antwort

Sehr interessant sind die Herausforderung des Projekt Euler (https://projecteuler.net/). Viel Spaß beim Lösen der 484 Probleme :)

...zur Antwort

"Wie man Programme erstellen muss" ist ein weit gefasster Begriff. Geht es Dir um das Syntax so sollten die "Dummies" Teile helfen (auch wenn ich kein großer Fan davon bin). Es gibt so folgende Standardwerke:

  • ISO C++ Standard (z.B. ein Working Draft wie http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf)
  • Bjarne Stroustrup: The C++ Programming Language

Da Du davon sprichst ein Anfänger zu sein, werden Dir folgende Tipps wohl weniger helfen (wenn es Dir bei Deiner Frage allerdings mehr darum geht "Wie man Programme erstellt" = "Wie man vernünftig mit C++ programmiert" sollten sie wunderbar passen):

  • Andrei Alexandrescu: Modern C++
  • Scott Meyers: Effective C++

Bjarne Stroustrup ist der Erfinder von C++ und ich meine mich zu erinnern, dass man nicht wirklich viel Vorwissen für sein Buch benötigt - dafür deckt es aber auch das komplette Spektrum ab. In der neusten Ausgabe (s. Link) geht er wohl auch ausgiebig auf den "neuen" Standard C++11 ein.

P.S.: Ich hatte eigentlich Links zu den Amazon-Seiten für die jeweiligen Bücher eingefügt aber offenbar hat GF gedacht, ich will hier nur spammen :O

...zur Antwort

Ich mochte Wolfgang Hohlbein in dem Alter sehr gern aber das ist häufig mit Sci-Fi/Fantasy gespickt. Ich finde es schade, dass Du sowas nicht lesen willst, da die Auswahl sonst auf zeitgenössische Literatur fällt, die häufig etwas hart und erbarmungslos erscheint. Beispiele hierfür sind Jakob der Lügner oder Das Leben des Iwan Denisowitsch. Ich habe später viel von Stanislaw Lem gelesen, da er eine Gabe hatte, ernste Themen mit einem gewissen Abstand aber einem hervorragendem Sarkasmus zu erzählen (ohne den Sci-Fi Aspekt außer Acht zu lassen). Wenn Du wirklich an den Puls vergangener Zeiten anknûpfen willst ist der Steppenwolf, Siddhartha, die Blechtrommel meiner Meinung nach ganz oben. Andere Sichtweisen erhälst Du durch Klassiker wie die Metamorphose von Kafka, romantische Werke wie Nathan der Weise oder die Leiden des jungen Werther. Die Möglichkeiten sind endlos und enden häufig in Göthes Faust. Aber ganz ehrlich - in dem Alter hab ich die Fantasie der Realität noch vorgezogen und war sehr glücklich damit...

...zur Antwort

Diese Grübeleien kennt wohl jeder. Mein Tipp: Abschalten. Rege Deine Phantasie an und bereite Dich auf Deine Träume vor. Entferne Dich in Gedanken von der Realität und denke an etwas Schönes. Vielleicht ist es keine schlechte Idee, vorher in einem Buch zu schmökern. Etwas aus dem Bereich Science-Fiction/Fantasy, dass Dich inspiriert zum Beispiel.

Und wenn Du Dich dabei erwischt, auf einmal wieder an den nächsten Tag, die Zukunft, Dein eigenes Leben zu denken, lenke Deine Gedanken wieder bewusst auf etwas Fantastisches. Das erfordert vielleicht etwas Übung aber ja, das kann man wirklich erlernen.

...zur Antwort