c-code in xcode kompiliert läuft anders als in visual studio kompiliert!?!

Diskutiere mit über: c-code in xcode kompiliert läuft anders als in visual studio kompiliert!?! im Mac OS X Entwickler, Programmierer Forum

  1. Nuuk

    Nuuk Thread Starter MacUser Mitglied

    Beiträge:
    260
    Zustimmungen:
    2
    Registriert seit:
    13.04.2003
    mich macht xcode gerade wahnsinnig.
    ich versuch grad stundenlang ein nicht sonderlich komplexes programm (in c) für die informatik vorlesung zu schreiben und bekomm es einfach nicht hin. (der debugger begeistert mich mit seiner anwesenheit, verkettete listen werden scheinbar nicht richtig erstellt, zum teil aber wieder doch)
    jetzt hab ich aus voller verzweiflung die einzelnen teile des codes in visual studio importiert und siehe da, das programm läuft ganz anders ab.
    plöztlich funktionieren meine eingebauten fehlermeldungen und alles erscheint zum ersten mal ansatzweise logisch.
    was soll das?
    xcode kann doch billigen c code nicht so viel anders kompilieren, wie visual studio, oder doch???
     
  2. BalkonSurfer

    BalkonSurfer Banned

    Beiträge:
    5.164
    Zustimmungen:
    0
    Registriert seit:
    27.07.2003
    Kommt auf den c-code an ;)
     
  3. oneOeight

    oneOeight MacUser Mitglied

    Beiträge:
    46.774
    Zustimmungen:
    3.629
    Registriert seit:
    23.11.2004
    wenn es in visual studio compiliert, scheinst du ja eher M$ c-code geschrieben zu haben ;)
     
  4. sir.hacks.alot

    sir.hacks.alot MacUser Mitglied

    Beiträge:
    2.406
    Zustimmungen:
    113
    Registriert seit:
    10.03.2005
    Ich denke auch das Du dich nicht an die C-Standards gehalten hast. Kannst den Code ja mal Posten
     
  5. Nuuk

    Nuuk Thread Starter MacUser Mitglied

    Beiträge:
    260
    Zustimmungen:
    2
    Registriert seit:
    13.04.2003
    na dann will ich doch mal code posten:

    das ist die funktion:

    Code:
    void einfuegenListe (ProdListe ** liste, ProdInfo * produkt)
    {
    	/* Angegebenes Produkt wird in die gegebene Liste eingefuegt */
    	while((*liste)!=NULL)
    	{
    	(*liste)=(*liste)->next;
    	}
    	
    	if ((*liste)==NULL)
    	{
    	(*liste)=malloc(sizeof(ProdListe));
    	(*liste)->info=produkt;
    	printf("liste erstellt! kontrolle: %s %f\n",(*liste)->info->name, (*liste)->info->preis);
    	}
    	else
    	printf("ERROR!!!!!!!!!!!");
    }
    
    und die 2 struct definitionen:

    Code:
    typedef 
    	struct prodliste {
    		ProdInfo * info;
    		struct prodliste * next;
    Code:
    typedef 
    	struct prodinfo { char name [20];
    					  double preis;
    	}
    ProdInfo;

    es geht darum, dass die daten aus produkt in die liste eingefügt werden. die nächste lieste soll dann in einem ringpuffer mit der vorherigen verkettet sein.
    xcode führt den code oben problemlos aus, bringt dann erst wenn man erneut auf die daten zugreifen will den debugger.
    visual studio bringt schon beim code oben fehler.
    seltsam find ich das... aber ich hab ja auch keine ahnung :rolleyes:

    was mir noch seltsam an xcode erscheint ist der fall einer endlosschleife. xcode führt dann die funktion vor der endlosschleife schon nicht mehr aus, anstatt erst die funktion vor der endlosschleife auszuführen und dann ins verderben zu rennen... komisch komisch...
    wahrscheinlich auch nur ein denkfehler... :rolleyes:
     
  6. Spacemojo

    Spacemojo MacUser Mitglied

    Beiträge:
    616
    Zustimmungen:
    21
    Registriert seit:
    16.05.2004
    Du schreibts in dem Code ja nie, wass (* liste)->next sein soll. Deshalb kann es sein, dass (* liste)->next je nach Betriebssystem anders gesetzt wird.
    Der Algorithmus muss so sein:
    Wenn liste->next = null, dann erstelle neueListe und setze liste->next = neueListe. Sonst liste = liste->next.



    Ein Fehler, der passieren kann: Verwenden con Variablen, die noch nicht gesetzt wurden:
    int xAlt = 10;
    int xNeu;
    if (xNeu < 20) xNeu = xAlt;

    statt
    if (xAlt < 20) xNeu = xAlt;

    Es kann sein, dass xNeu, einen Wert bekommt, der < 20 ist, dann funktioniert dein Programm. Wenn du dann irgendwo im Code was änderst (z.B. printf("test"); ist xNeu vielleicht > 20 und das Programm macht Käse.



    Tobi
     
  7. BalkonSurfer

    BalkonSurfer Banned

    Beiträge:
    5.164
    Zustimmungen:
    0
    Registriert seit:
    27.07.2003
    ProdListe? rotfl Hat's für ein "ukt" nicht mehr gereicht? :D
     
  8. Pingu

    Pingu MacUser Mitglied

    Beiträge:
    4.894
    Zustimmungen:
    341
    Registriert seit:
    04.08.2003
    Außerdem darfst Du nicht davon ausgehen, daß ein Speicherbereich nach dem alloziieren zu Null initialisiert ist. Daß heißt, wenn Du Speicher für eine Struktur anforderst und in dieser Struktur sind wiederum Zeigerelemente, heißt das nicht, daß Du einen Auswertung mit NULL vornehmen kannst. Das hängt stark vom verwendeten Compiler ab.
    Deshalb habe ich es mir angewöhnt, jeden angeforderten Speicher selber zu initialisieren. Ebenso nach dem Freigeben von Speicherbereichen führe ich eine explizite NULL-Zuweisung aus. Zum Beispiel mein aktueller Compiler (LabWindows/CVI) führt keine Initialisierung selbstständig durch.
    Deshalb, nie von irgendwelchen Annahmen ausgehen.

    Pingu
     
  9. Spacemojo

    Spacemojo MacUser Mitglied

    Beiträge:
    616
    Zustimmungen:
    21
    Registriert seit:
    16.05.2004
    Du kannst ja auch mal im Terminal kompilieren.
    Hier ist eine Makefile, die du verwenden kannst:
    Einfach Makefile und Datei mit Code ins gleiche Verzeichnis. In der Makefile bei
    PROGRAM =
    den gewünschten Programmnamen eintippen
    und bei
    OBJS =
    die Objekte, die gelinkt werden sollen, z.B. MeineDatei.o
    Dann einfach "make" im Terminal eingeben und Programm starten.

    Tobi
     
  10. Pingu

    Pingu MacUser Mitglied

    Beiträge:
    4.894
    Zustimmungen:
    341
    Registriert seit:
    04.08.2003
    Außerdem funktioniert es so sowieso nicht. Meine Alternative sähe so aus:
    Code:
    void einfuegenListe (ProdListe ** liste, ProdInfo * produkt)
    {
      struct ProdList	*_tmp;
    
      /* erstes Element benötigt eine Sonderbehandlung */
      if (!*liste) {
    
        // was tun wenn kein Speicher mehr?
        if (!(_tmp = malloc(struct ProdList))) return;
    
        // das neue Element initialisieren
        _tmp->info = produkt;
        _tmp->next = NULL;
    
        // damit die Liste auch auf das neue Element zeigt
        liste = &_tmp;
    
        return;
    
      } // if (*liste == NULL)
    
      // zum Ende der Liste gehen
      _tmp = *liste;
      while (_tmp->next) _tmp = _tmp->next;
    
      // neues Element hinzufügen
    
      // immer bedenken, daß der Speicher alle sein könnte
      if (!(_tmp->next = malloc(struct ProdList))) return;
    
      // neues Element initialisieren
      _tmp->next->info = produkt;
      _tmp->next->next = NULL;
    
      // das wars
      return;
    }
    
    Alternativ, könnte man das neue Element aber auch am Anfang der Liste hinzufügen:
    Code:
    void einfuegenListe (ProdListe ** liste, ProdInfo * produkt)
    {
      struct ProdList	*_tmp;
    
      // was tun wenn kein Speicher mehr?
      if (!(_tmp = malloc(struct ProdList))) return;
    
      // das neue Element initialisieren
      _tmp->info = produkt;
    
      // aktuelle Liste an das neue Element anfügen
      _tmp->next = *liste;
    
      // neues Element als neue Liste definieren
      liste = &_tmp;
    
      // das wars
      return;
    }
    

    Pingu
     
Die Seite wird geladen...
Ähnliche Themen - code xcode kompiliert Forum Datum
Xcode: drag & drop geht nicht (um ein Code Snippet zu erstellen) Mac OS X Entwickler, Programmierer 26.10.2015
"Lines of code" in Xcode zählen Mac OS X Entwickler, Programmierer 12.08.2009
iPhone Developer Program - XCode code signing - Nightmare Mac OS X Entwickler, Programmierer 03.08.2008
Code in Xcode kompilieren und ausführen Mac OS X Entwickler, Programmierer 30.11.2007
Code Completion in XCode für Qt Mac OS X Entwickler, Programmierer 16.05.2006

Diese Seite empfehlen

Benutzerdefinierte Suche