Anzeige:
Ergebnis 1 bis 10 von 10

Thema: for-Schleife in die Bedingung der while-Schleife

  1. #1
    Registrierter Benutzer Avatar von The EYE
    Registriert seit
    15.12.2008
    Ort
    Hameln
    Beiträge
    332

    for-Schleife in die Bedingung der while-Schleife

    Hallo!

    Ich möchte eine while Schleife erstellen, bei der in der while-Bedingung eine for-Schleife steht.
    Ich habe mal ein kleines Beispielprogramm geschrieben. Mir ist bewusst, dass es sich hierbei auch um eine Endlosschleife handelt (bzw. handeln würde, sie funktioniert ja nicht).

    Code:
    #include<iostream>
    
    using namespace std;
    
    int main()
    {
    	int array1[10][10];
    	int array2[10][10];
    
    	// Nullsetzen von array1
    	for(int i=0; i<=9; i++)
    	{
    		for(int j=0; j<=9; j++)
    		{
    			array1[i][j] = 0;
    		}
    	}
    
    	// Nullsetzen von array2
    	for(int i=0; i<=9; i++)
    	{
    		for(int j=0; j<=9; j++)
    		{
    			array2[i][j] = 0;
    		}
    	}
    
    	
    	while (
    				for(int i=0; i<=9; i++)
    				{
    					for(int j=0; j<=9; j++)
    					{
    					array1[i][j] == array2[i][j];
    					}
    				}
    			)
    	{
    		cout << "Arrays sind identisch!" << endl;
    
    	return 0;
    }
    Das Problem ist, dass ich (wenn ich richtig informiert bin) Arrays nicht "im ganzen" miteinander vergleichen kann, sondern immer alles Schrittweise ausführen muss. Daher die for-Schleife.

    Ich bin gespannt auch eure Lösungen!

    Gruß Max
    ¹: Erstelle bitte ein richtiges Minimalbeispiel
    ²: Ich nutze Ubuntu 14.04, TeX Live 2014 & Kile 2.1.3

  2. #2
    Registrierter Benutzer
    Registriert seit
    14.01.2002
    Beiträge
    657
    du musst das anderst lösen! sonst verbrauchst du immer alle cpu wegen der überprüfung.
    aber du möchtest es in der art so:


    Code:
      int identisch = 1;
      while (1) {
        for(int i=0; i<=9; i++) {
          for(int j=0; j<=9; j++) {
            if ( array1[i][j] != array2[i][j] ) {
              identisch  = 0; break;
            }
          }
          if ( !identisch ) break;
        }
        if ( identisch )
          cout << "Arrays sind identisch!" << endl;
        else
          break;
    
      }

    aber du solltest es so programmieren, dass bei jeder änderung der arrays eine fkt aufgerufen wird, die nur die änderungen überprüft und dann
    ermittelt ob das array nun identisch ist.

  3. #3
    Registrierter Benutzer Avatar von The EYE
    Registriert seit
    15.12.2008
    Ort
    Hameln
    Beiträge
    332
    Hey!

    Du meinst, wenn sich bei array1[5][4] der Wert geändert hat sollte nur dieser Bereich berücksichtigt werden?
    In dem Programm, in das das ganze eingebaut wird sich das Array allerdings meistens sehr stark ändern.

    Gruß Max
    ¹: Erstelle bitte ein richtiges Minimalbeispiel
    ²: Ich nutze Ubuntu 14.04, TeX Live 2014 & Kile 2.1.3

  4. #4
    Registrierter Benutzer
    Registriert seit
    14.01.2002
    Beiträge
    657
    auf jeden fall sollltest du das überprüfen der arrays irgendwo "triggern" und das nicht in einer for schleife ewig machen

  5. #5
    rennradler
    Gast
    Zwei Arrays kann man auch mit der Funktion memcmp vergleichen. Das ist die effizienteste Methode, weil hier handoptimierter Assemblercode dahinter steht. Vorsichtig sein muß man sein, wenn es ein Array aus strukturieren Datentypen ist, da man nicht sicher sein kann, was in den aufgrund von Memory Alignments unbelegten Bytes für Werte stehen.

  6. #6
    Registrierter Benutzer Avatar von jeebee
    Registriert seit
    01.01.2005
    Ort
    Bern || Zürich
    Beiträge
    540
    Zitat Zitat von rennradler Beitrag anzeigen
    ... da man nicht sicher sein kann, was in den aufgrund von Memory Alignments unbelegten Bytes für Werte stehen.
    Deshalb ist es sicher keine schlechte Idee, dass man so ein Array entweder mit calloc(n, sizeof(ArrayElement_t)) oder mit malloc/memset(..., 0, n*sizeof(ArrayElement_t)) initialisiert. Dann ist nämlich der gesamte Memory-Bereich mit 0 gefüllt und memcmp funktioniert zuverlässig.

    HTH

    jeebee
    my very own 128 bit integer
    C4 D3 B8 A8 9E A0 C6 EC 7D EC A8 15 28 D1 92 58
    more information

  7. #7
    Registrierter Benutzer Avatar von The EYE
    Registriert seit
    15.12.2008
    Ort
    Hameln
    Beiträge
    332
    Hey!

    Könntet ihr das an einem kleinen Beispielprogramm deutlich machen?

    Gruß Max
    ¹: Erstelle bitte ein richtiges Minimalbeispiel
    ²: Ich nutze Ubuntu 14.04, TeX Live 2014 & Kile 2.1.3

  8. #8
    Registrierter Benutzer Avatar von jeebee
    Registriert seit
    01.01.2005
    Ort
    Bern || Zürich
    Beiträge
    540
    Code:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    struct s {
        int x;
        short y;
        int z;
    }; // memory layout: bytes 0-3: x, 4-5: y, 8-11: z
    
    int main()
    {
        struct s *array = calloc(10, sizeof(struct s));
        for (i = 0; i < 10; i++) {
            array[i].x = i;
            array[i].y = 2*i;
            array[i].z = 3*i;
        }
        struct s *array2 = calloc(10, sizeof(struct s));
        for (i = 0; i < 10; i++) {
            array2[i].x = i;
            array2[i].y = 2*i;
            array2[i].z = 3*i;
        }
    
        if (memcmp(array, array2, 10*sizeof(struct s)) != 0) {
            printf("contents of array and array2 are not equal!\n");
        } else {
            printf("contents of array and array2 are equal!\n");
        }
    
        array2[3].z = 0;
    
        if (memcmp(array, array2, 10*sizeof(struct s)) != 0) {
            printf("contents of array and array2 are not equal!\n");
        } else {
            printf("contents of array and array2 are equal!\n");
        }
    
        return 0;
    }
    my very own 128 bit integer
    C4 D3 B8 A8 9E A0 C6 EC 7D EC A8 15 28 D1 92 58
    more information

  9. #9
    Registrierter Benutzer Avatar von The EYE
    Registriert seit
    15.12.2008
    Ort
    Hameln
    Beiträge
    332
    Hey!

    Ich glaube du hattest zwei int vergessen.
    Bekomme noch folgende Fehlermeldung:
    error C2440: 'Initialisierung': 'void *' kann nicht in 's *' konvertiert werden
    (Zeile 13 und 19)

    Und hier der Code:
    Code:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    struct s {
        int x;
        short y;
        int z;
    }; // memory layout: bytes 0-3: x, 4-5: y, 8-11: z
    
    int main()
    {
        struct s *array = calloc(10, sizeof(struct s));
        for (int i = 0; i < 10; i++) {
            array[i].x = i;
            array[i].y = 2*i;
            array[i].z = 3*i;
        }
        struct s *array2 = calloc(10, sizeof(struct s));
        for (int i = 0; i < 10; i++) {
            array2[i].x = i;
            array2[i].y = 2*i;
            array2[i].z = 3*i;
        }
    
        if (memcmp(array, array2, 10*sizeof(struct s)) != 0) {
            printf("contents of array and array2 are not equal!\n");
        } else {
            printf("contents of array and array2 are equal!\n");
        }
    
        array2[3].z = 0;
    
        if (memcmp(array, array2, 10*sizeof(struct s)) != 0) {
            printf("contents of array and array2 are not equal!\n");
        } else {
            printf("contents of array and array2 are equal!\n");
        }
    
        return 0;
    }
    Gruß Max
    ¹: Erstelle bitte ein richtiges Minimalbeispiel
    ²: Ich nutze Ubuntu 14.04, TeX Live 2014 & Kile 2.1.3

  10. #10
    Registrierter Benutzer Avatar von jeebee
    Registriert seit
    01.01.2005
    Ort
    Bern || Zürich
    Beiträge
    540
    Ja, die ints hab ich vergessen... Btw: für ISO C90 (selten, aber trotzdem erwähnenswert) sollte das int i vor dem ersten for und nicht im for drin stehen.

    Bezgl. Fehlermeldung: Compiler, Version; Betriebssystem, Version?

    edit: gcc meckert wegen dem int i im for auch ohne auf strict ansi gesetzt zu sein... damit's wirklich ISO C90 (ANSI C89) ist, müsste noch der //-Kommentar durch einen /* */-Kommentar ersetzt werden.


    So kompilierts mit
    Code:
    gcc -Wall -Wextra -ansi -pedantic -o mcmp mcmp.c
    (gcc 4.4.5) ohne Warnungen:
    Code:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    struct s {
        int x;
        short y;
        int z;
    }; /* memory layout: bytes 0-3: x, 4-5: y, 8-11: z */
    
    int main()
    {
        /* all variable declarations need to be at begin of block (for -pedantic) */
        struct s *array = calloc(10, sizeof(struct s));
        struct s *array2 = calloc(10, sizeof(struct s));
        int i;
        for (i = 0; i < 10; i++) {
            array[i].x = i;
            array[i].y = 2*i;
            array[i].z = 3*i;
        }
        for (i = 0; i < 10; i++) {
            array2[i].x = i;
            array2[i].y = 2*i;
            array2[i].z = 3*i;
        }
    
        if (memcmp(array, array2, 10*sizeof(struct s)) != 0) {
            printf("contents of array and array2 are not equal!\n");
        } else {
            printf("contents of array and array2 are equal!\n");
        }
    
        array2[3].z = 0;
    
        if (memcmp(array, array2, 10*sizeof(struct s)) != 0) {
            printf("contents of array and array2 are not equal!\n");
        } else {
            printf("contents of array and array2 are equal!\n");
        }
    
        return 0;
    }
    Geändert von jeebee (22-12-2010 um 00:32 Uhr)
    my very own 128 bit integer
    C4 D3 B8 A8 9E A0 C6 EC 7D EC A8 15 28 D1 92 58
    more information

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •