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

  1. Nuuk

    Nuuk Thread StarterMacUser Mitglied

    Mitglied seit:
    13.04.2003
    Beiträge:
    260
    Zustimmungen:
    2
    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???
     
    Nuuk, 23.04.2006
  2. BalkonSurfer

    BalkonSurferMacUser Mitglied

    Mitglied seit:
    27.07.2003
    Beiträge:
    5.157
    Zustimmungen:
    1
    Kommt auf den c-code an ;)
     
    BalkonSurfer, 23.04.2006
  3. oneOeight

    oneOeightMacUser Mitglied

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

    sir.hacks.alotMacUser Mitglied

    Mitglied seit:
    10.03.2005
    Beiträge:
    2.408
    Zustimmungen:
    113
    Ich denke auch das Du dich nicht an die C-Standards gehalten hast. Kannst den Code ja mal Posten
     
    sir.hacks.alot, 23.04.2006
  5. Nuuk

    Nuuk Thread StarterMacUser Mitglied

    Mitglied seit:
    13.04.2003
    Beiträge:
    260
    Zustimmungen:
    2
    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:
     
    Nuuk, 23.04.2006
  6. Spacemojo

    SpacemojoMacUser Mitglied

    Mitglied seit:
    16.05.2004
    Beiträge:
    617
    Zustimmungen:
    21
    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
     
    Spacemojo, 24.04.2006
  7. BalkonSurfer

    BalkonSurferMacUser Mitglied

    Mitglied seit:
    27.07.2003
    Beiträge:
    5.157
    Zustimmungen:
    1
    ProdListe? rotfl Hat's für ein "ukt" nicht mehr gereicht? :D
     
    BalkonSurfer, 24.04.2006
  8. Pingu

    PinguMacUser Mitglied

    Mitglied seit:
    04.08.2003
    Beiträge:
    4.900
    Zustimmungen:
    341
    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
     
    Pingu, 24.04.2006
  9. Spacemojo

    SpacemojoMacUser Mitglied

    Mitglied seit:
    16.05.2004
    Beiträge:
    617
    Zustimmungen:
    21
    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
     
    Spacemojo, 24.04.2006
  10. Pingu

    PinguMacUser Mitglied

    Mitglied seit:
    04.08.2003
    Beiträge:
    4.900
    Zustimmungen:
    341
    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
     
    Pingu, 24.04.2006
Die Seite wird geladen...