grade lief es noch, jetzt nichtmehr O_o



  • int i = 10;
    (++i);
    //hier ist i == 11
    
    int i = 10;
    (i++);
    //hier ist i == 11
    
    for (i = 0; i < 10; ++i) { /*in der schleife*/ }
    //lässt sich übersetzen:
    
    i = 0;
    for_loop_begin:
       if (i < 10) goto for_loop_end;
       /* in der schleife */
       ++i;
       goto for_loop_begin;
    for_loop_end:
    

    ++i oder i++ wird auf jedenfall i inkrementieren, bevor die schleife neu beginnt

    und (d)ein array beginnt immer mit 0

    #define MAX 10
    
    int x[MAX];
    
    //x gültig von x[0] bis x[MAX-1]
    

    bei der ausgabe kannst du ja i+1 ausgeben lassen, wenn dich die ausgabe
    "0.Rechteck" stört



  • achsooo
    da ich vorher MAX_RECT mit 2 definiert habe, hat das array nur r[0] und r[1], wenn ich aber nun in r[2].xcor zB schreibe, liefert er mir diese komischen werte...
    versteh ich das richtig ?
    funktionieren tuts jedenfalls jetzt 🙂

    [ Dieser Beitrag wurde am 25.04.2003 um 22:47 Uhr von raffnix editiert. ]



  • genau. du schreibst in speicher, der dir nicht gehört.
    kannst frog sein, wenn das programm nicht einfach so abstürzt 😉
    (undefiniertes verhalten)



  • hrrhrr
    ist sogar das eine oder andre mal abgestürzt 🙂
    vielen dank nochmal *thumbs up*



  • Original erstellt von Lars:
    for ( i=1; i<=MAX_RECT; i++)
    hier i=0
    und ++i (siehe FAQ, i++ ist langsamer)

    Das möchte ich bewiesen haben. In dem x++/++x-Thread habe ich nichts darüber gefunden. Im übrigen produzierenb beide Varianten auch bei maximaler Optimierung densleben ASM-Code.

    [ Dieser Beitrag wurde am 25.04.2003 um 23:08 Uhr von TriPhoenix editiert. ]



  • in C++ wegen implementierungen von operator++() und operator++(int) gibt es schon einen geschwindigkeitsunterschied (wenn man den beiden das "richtige" verhalten aufdruckt) - wegen temporärer objekte
    bei builtins ist das egal. und in C imho auch



  • i++
    ist semantisch falsch!

    denn i++ drückt aus, dass wir den wert von i wollen und DANN erst erhöhen wollen.

    ++i drückt aus, dass wir i erhöhen wollen (und uns nur der erhöhte wert interessiert)

    abgesehen davon kann i++ langsamer sein als ++i (kann, muss aber nicht. in C wirds wohl kaum der fall sein, aber in anderen sprachen (mit C syntax) kann dass sehr wohl der fall sein - also nennt mir einen grund warum ich die semantisch falsche variante der semantisch richtigeren die uU sogar noch schneller ist vorziehen sollte)



  • nevertheless...
    hab das programm jetzt fast fertig, ich poste es nochmal

    #include <stdio.h>
    #define size 41
    #define MAX_RECT 2
    
    char matrix[size][size];
    
    typedef struct {
            int flaeche;
            int index;
            int xcor;
            int ycor;
            int laenge;
            int breite;} Rechteck;
    
    void print_Rechteck();
    void draw_Rechteck();
    void raw_matrix(void);
    void draw_rects();
    void show_matrix(void);
    
    void print_Rechteck( Rechteck r1) {
         printf("Rechteck %d : \n\n", r1.index);
         printf("X-Kor : %d \n", r1.xcor);
         printf("Y-Kor : %d \n", r1.ycor);
         printf("Laenge: %d \n", r1.laenge);
         printf("Breite: %d \n\n", r1.breite);
         printf("Flaeche: %d \n\n", r1.flaeche);
    }
    
    // ------------------------------------------------------------------
    
    void raw_matrix() {
         int x,y, zahlX, zahlY;
         for (x=0; x<size; x++) {
             for (y=0; y<size; y++) {
                 matrix[x][y]='.';
                 zahlX=x%10;
                 zahlY=y%10;
                 if (x>0 && y==0) {
                     switch (zahlX) {
                         case 0: matrix[x][y]='0';break;
                         case 1: matrix[x][y]='1';break;
                         case 2: matrix[x][y]='2';break;
                         case 3: matrix[x][y]='3';break;
                         case 4: matrix[x][y]='4';break;
                         case 5: matrix[x][y]='5';break;
                         case 6: matrix[x][y]='6';break;
                         case 7: matrix[x][y]='7';break;
                         case 8: matrix[x][y]='8';break;
                         case 9: matrix[x][y]='9';break;
                     }
                 }
                 if (y>0 && x==0) {
                     switch (zahlY) {
                         case 0: matrix[x][y]='0';break;
                         case 1: matrix[x][y]='1';break;
                         case 2: matrix[x][y]='2';break;
                         case 3: matrix[x][y]='3';break;
                         case 4: matrix[x][y]='4';break;
                         case 5: matrix[x][y]='5';break;
                         case 6: matrix[x][y]='6';break;
                         case 7: matrix[x][y]='7';break;
                         case 8: matrix[x][y]='8';break;
                         case 9: matrix[x][y]='9';break;
                     }
                 }
             }
         }
    }
    
    // ------------------------------------------------------------------
    
    void draw_rects( Rechteck r1) {
         int xmitte=r1.xcor+r1.breite/2;
         int ymitte=r1.ycor+r1.laenge/2;
         int i;
         int ueberlappen=0;
         for (i=r1.xcor; i<=r1.xcor+r1.breite; i+=1) {
             if (matrix[i][r1.ycor]=='0') {
                 ueberlappen++;
             }
             matrix[i][r1.ycor]='0';
         }
         for (i=r1.xcor; i<=r1.xcor+r1.breite; i+=1) {
             if (matrix[i][r1.ycor+r1.laenge]=='0') {
                 ueberlappen++;
             }
             matrix[i][r1.ycor+r1.laenge]='0';
         }
         for (i=r1.ycor+1; i<=r1.ycor+r1.laenge-1; i+=1) {
             if (matrix[r1.xcor][i]=='0') {
                 ueberlappen++;
             }
             matrix[r1.xcor][i]='0';
         }
         for (i=r1.ycor+1; i<=r1.ycor+r1.laenge-1; i+=1) {
             if (matrix[r1.xcor+r1.breite][i]=='0') {
                 ueberlappen++;
             }
             matrix[r1.xcor+r1.breite][i]='0';
         }
    }
    
    // ------------------------------------------------------------------
    
    void show_matrix() {
         int x,y;
         for ( y=0; y<size; y++ ) {
             for (x=0; x<size; x++ ) {
                 printf("%c", matrix[x][y] );
             }
             printf("\n");
         }
    }
    
    int main()
    {
          int i;
          Rechteck r[MAX_RECT];
    
          // Programmvorstellung und Eingabe der Rechteckdaten
    
          printf("Dies ist ein Programm zur Darstellung und Berechnung von Rechtecken.\n");
          printf("Bitte im Folgenden die Daten der Rechtecke (x- und y- Koordinate\n");
          printf("des oberen linken Punktes, sowie Laenge und Breite) eingeben.\n");
          printf("Gueltig sind Werte von 1 bis %d (nur ganze Zahlen!).\n\n", size-1);
    
          for ( i=0; i<MAX_RECT; i+=1) {
              printf("X-Koordinate des %d. Rechteck: ", i+1); scanf("%d", &r[i].xcor);
              printf("Y-Koordinate des %d. Rechteck: ", i+1); scanf("%d", &r[i].ycor);
              printf("Laenge des %d. Rechteck: ", i+1); scanf("%d", &r[i].laenge);
              printf("Breite des %d. Rechteck: ", i+1); scanf("%d", &r[i].breite);
              printf("\n"); r[i].index=i+1; r[i].flaeche=r[i].breite * r[i].laenge;
    
          // Überprüfung der eingegebenen Daten auf Fehler
    
              if (r[i].xcor<1 || r[i].xcor>size-1 || r[i].ycor<1 || r[i].ycor>size-1 || (r[i].xcor+r[i].breite)>size-1 || (r[i].ycor+r[i].laenge)>size-1 || r[i].breite<1 || r[i].laenge<1){
                 printf("FEHLER : Ihr Rechteck geht ueber die Anzeige hinaus, oder ein Wert liegt\n");
                 printf("nicht zwischen 1 und %d. Bitte wiederholen sie die Eingabe!\n\n", size-1);
                 i-=1;
              }
          }
    
          for (i=0; i<MAX_RECT; i+=1) {
              print_Rechteck(r[i]);
          }
    
          raw_matrix();
          for (i=0; i<MAX_RECT; i+=1) {
              draw_rects(r[i]);
          }
          show_matrix();
          return 0;
    }
    

    Nicht über den Code lachen, bin Anfänger 😃
    Nun möchte ich noch folgendes implementieren:
    in draw_rects möchte ich "matrix[xmitte-1][ymitte]='R';matrix[xmitte][ymitte]='/*Die Nummer des Rechtecks*/';"
    Ich hab keine Ahnung wie ich das verwirklichen soll 😞
    Mit den ueberlappen-if schleifen will ich halt feststellen, ob sich die beiden Rechtecke irgendwie überlappen :D. Wenns !=0 ist dann ueberlappen sie sich, aber ich hab keine Ahnung, wie ich den Wert ins main übertragen kann, der wird ja bei jedem Aufruf der Funktion wieder gelöscht weils nur ne lokale Variable ist... hilft es mir die als global zu definieren ?

    edit : achja.. in raw_matrix will ich am linken und oberen rand ne durchnummerierung von 0-9 haben, kann ich das einfacher machen als mit dem switch-ding ?

    [ Dieser Beitrag wurde am 26.04.2003 um 00:19 Uhr von raffnix editiert. ]



  • Original erstellt von Shade Of Mine:
    **i++
    ist semantisch falsch!

    denn i++ drückt aus, dass wir den wert von i wollen und DANN erst erhöhen wollen.**

    der wert interessiert uns in dem moment aber nicht, sondern erst in der schleife. und dort ist i erhöht, egal ob mit ++i oder i++

    **
    ++i drückt aus, dass wir i erhöhen wollen (und uns nur der erhöhte wert interessiert)**

    i++ drückt auch aus, dass wir i erhöhen wollen. und dass uns der wert erst in der nächsten zeile interessiert, drückt die schleife aus.
    ander als bei einer zuweisung.

    **
    abgesehen davon kann i++ langsamer sein als ++i (kann, muss aber nicht. in C wirds wohl kaum der fall sein, aber in anderen sprachen (mit C syntax) kann dass sehr wohl der fall sein - also nennt mir einen grund warum ich die semantisch falsche variante der semantisch richtigeren die uU sogar noch schneller ist vorziehen sollte)**

    Ja, ich habe deshalb auch Lars darauf hingewiesen, dass es in C keinen unterschied macht. ich habe weder gesagt, schreib i++ noch behauptet, es sei in anderen sprachen ebenso gleichgültig.

    der sinn von ++ bezieht sich aber auf die aktuelle anweisung, für die anweisung danach ist beides richtig (imo auch semantisch:
    IMO bedeutet ++ für die aktuelle und die nächste anweisung 2 verschiedene dinge, für die aktuelle hat es wert-und-dann-erhöhen, oder erhöhen-und-dann-wert semantik, für die nächste anweisung nur mehr erhöhen-semantik

    aber um sich das nicht anzugewöhnen, sollte man in C auch die prefix variante verwenden. ich finde nur das argument mit der semantik in dem fall falsch (in dem Fall = imo)



  • Original erstellt von Shade Of Mine:
    **i++
    ist semantisch falsch!

    denn i++ drückt aus, dass wir den wert von i wollen und DANN erst erhöhen wollen.

    ++i drückt aus, dass wir i erhöhen wollen (und uns nur der erhöhte wert interessiert)
    **

    Kommt beides auf dasselbe hinaus. Denn die Erhöhungsoperation wird für sich alleine ausgeführt nach dem Schleifenkörper. Das semantsiche Problem sehe ich nicht.

    **
    abgesehen davon kann i++ langsamer sein als ++i (kann, muss aber nicht. in C wirds wohl kaum der fall sein, aber in anderen sprachen (mit C syntax) kann dass sehr wohl der fall sein - also nennt mir einen grund warum ich die semantisch falsche variante der semantisch richtigeren die uU sogar noch schneller ist vorziehen sollte)**

    Warum soltle es in irgendiener Sprache großartig langsamer sein. Ob man nun erst den Wert kopiert und dann erhöht ode rumgekehrt, das macht keinen Unterschied weiter. Für Objekte ist das natürlich was anderes, aber wir reden von ints.



  • naja... bevor ihr euch prügelt... 😃
    hab meine Probleme lösen können.
    Nur die langen switch-anweisungen nerven mich noch


Anmelden zum Antworten