Int Vektor



  • Also ich hab da ne etwas merkwürdige Aufgabenstellung bekommen:

    a)Deklarieren Sie einen Vektor vom Typ "integer", der aus 200 Elementen besteht.
    b)Initialisieren Sie per Programmm alle Vektorelemente mit dem Wert 1.

    Seh ich das jetzt richtig oder ist da wirklich nur :

    main()
    {
    int vektor[199];
    int size_feld;
        for(size_feld=0; size_feld<strlen(feld); size_feld++)      
        {
        feld[size_feld]=1;                             
        }
    
    }
    

    kommt mir fast zu einfach wenn ich da an die andern sachen denke die ich davor schreiben musste^^



  • Da sieht man mal wieder wie weit Wahrnehmung und Wirklichkeit auseinander liegen können. Schau dir lieber nochmal das Kapitel über Arrays an, und frag dich wofür das "str" in "strlen" stehen könnte.



  • main()
    {
    int vektor[199];
    int size_feld;
        for(size_feld=0; size_feld<strlen(vektor); size_feld++)      
        {
        feld[size_feld]=1;                            
        }
    
    }
    

    hm hab die struktur ausm alten programm kopiert und vergessen ne variable umzubennen macht das so mehr sinn?



  • hi!
    ich würde das so machen...

    #include <stdio.h>
    #include <stdlib.h>
    
    int main() {
    
       int a[10];
       int i;
       int size;
    
       size=printf("sizeof: %d", sizeof(a)/sizeof(int));
    
       for(i=0; i<size; i++) {
          printf("\na=%d", a[i]);
       }
       printf("\n...fertig...\n\n");
    
       return EXIT_SUCCESS;
    


  • Was spricht gegen "int array[200] = {1};" :x

    Was ist das denn für ein Quatsch:

    thomas_m schrieb:

    size=printf("sizeof: %d", sizeof(a)/sizeof(int));
    

    size wird am Ende strlen("sizeof: ") + Anzahl Ziffern von sizeof(a)/sizeof(int)) haben.

    Wenn schon

    size=sizeof(a)/sizeof(int);
    printf("sizeof: %d", size);
    


  • Dragonslayer schrieb:

    a)Deklarieren Sie einen Vektor vom Typ "integer", der aus 200 Elementen besteht.
    b)Initialisieren Sie per Programmm alle Vektorelemente mit dem Wert 1.

    int a[200];
    memset (a, 1, sizeof(a)/sizeof(int));
    

    🙂



  • nochmal ne frage warum geht der bei der ausgabe bis 230 wenn das feld nur 199 lang ist?

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    main()
    {
    
    int vektor[199];
    int size_feld;
    int x=0;
    
        for(size_feld=0; size_feld<sizeof(vektor); size_feld++)      
        {
        vektor[size_feld]=1;
    	printf("%i|",vektor[0]);
    	printf("%i\n",x);
    	x++;
        }
    
    }
    


  • feigling schrieb:

    Was spricht gegen "int array[200] = {1};" :x

    assert(array[0] != array[1]);



  • Dragonslayer schrieb:

    nochmal ne frage warum geht der bei der ausgabe bis 230 wenn das feld nur 199 lang ist?

    Google: c strlen



  • finix schrieb:

    feigling schrieb:

    Was spricht gegen "int array[200] = {1};" :x

    assert(array[0] != array[1]);

    Dann scheint es wirklich nur mit {0} zu funktionieren. Ich meinte mich erinnert zu haben, dass "int array[200] = {1};" bei mir mal das ganze Array auf 1 gesetzt zu haben, aber da hab ich mich wohl geirrt. Dann halt via Schleife oder memset.



  • Wobei memset() bei int-Werten auch nicht das wahre ist - das arbeitet nämlich byteweise 😉 (d.h. vista's memset (a,1,sizeof(a)/sizeof(int)); füllt die ersten 50 Array-Elemente mit 0x01010101 (für sizeof(int)==4) bzw. die ersten 100 Elemente mit 0x0101 (sizeof(int)==2))



  • feigling schrieb:

    finix schrieb:

    feigling schrieb:

    Was spricht gegen "int array[200] = {1};" :x

    assert(array[0] != array[1]);

    Dann scheint es wirklich nur mit {0} zu funktionieren. Ich meinte mich erinnert zu haben, dass "int array[200] = {1};" bei mir mal das ganze Array auf 1 gesetzt zu haben, aber da hab ich mich wohl geirrt.

    Jo, im Standard liest sich das so:

    If there are fewer initializers in a brace-enclosed list than there are elements or members of an aggregate, or fewer characters in a string literal used to initialize an array of known size than there are elements in the array, the remainder of the aggregate shall be initialized implicitly the same as objects that have static storage duration.

    Wobei "static storage duration" das altbekannte mit-0-initialisieren ist.



  • CStoll schrieb:

    Wobei memset() bei int-Werten auch nicht das wahre ist - das arbeitet nämlich byteweise 😉 (d.h. vista's memset (a,1,sizeof(a)/sizeof(int)); füllt die ersten 50 Array-Elemente mit 0x01010101 (für sizeof(int)==4) bzw. die ersten 100 Elemente mit 0x0101 (sizeof(int)==2))

    du hast recht, da bin ich schon 1000mal drauf reingefallen 😞
    bleibt wohl nur noch 'ne selbstgemachte schleife....



  • feigling schrieb:

    finix schrieb:

    feigling schrieb:

    Was spricht gegen "int array[200] = {1};" :x

    assert(array[0] != array[1]);

    Dann scheint es wirklich nur mit {0} zu funktionieren. Ich meinte mich erinnert zu haben, dass "int array[200] = {1};" bei mir mal das ganze Array auf 1 gesetzt zu haben, aber da hab ich mich wohl geirrt. Dann halt via Schleife oder memset.

    du meinst eher

    int array[200] = {[0 ... 199] = 1};
    

    das setzte das ganze Array auf 1.



  • supertux schrieb:

    du meinst eher

    int array[200] = {[0 ... 199] = 1};
    

    das setzte das ganze Array auf 1.

    😮 Aus welcher Version des C-Standards ist denn DAS?

    @vista: Da ist C++ mal wieder im Vorteil - fill() und fill_n() arbeiten zuverlässig mit beliebigen Datentypen 😉
    (nein, ich will jetzt keine Diskussion C vs. C++ eröffnen 🕶)



  • CStoll schrieb:

    @vista: Da ist C++ mal wieder im Vorteil - fill() und fill_n() arbeiten zuverlässig mit beliebigen Datentypen 😉

    kannste auch in C basteln:

    void special_memset (void *dest, void *src, size_t size_of_element, size_t num_elements)
    {
       while (num_elements)
       {
          memcpy (dest, src, size_of_element);
          dest = (char*)dest + size_of_element;
          num_elements--;
       }
    }
    
    ...
       int a[200];
       int value = 1;
       special_memset (a, &value, sizeof(int), sizeof(a)/sizeof(int));
    ...
    

    🙂



  • CStoll schrieb:

    supertux schrieb:

    du meinst eher

    int array[200] = {[0 ... 199] = 1};
    

    das setzte das ganze Array auf 1.

    😮 Aus welcher Version des C-Standards ist denn DAS?

    keine Ahnung, ich hab es selber vor 3 Tagen entdeckt, als ich veraltete Kernel Module für Linux 2.4 in Linux 2.6 portiert habe, da ist es mir aufgefallen und hatte keine Ahnung, was das bedeutete, also schnell probiert und gestaunt 🕶



  • Scheint eine gcc-Erweiterung sein 🙄



  • TactX schrieb:

    Scheint eine gcc-Erweiterung sein 🙄

    dann ist es eine schöne nützliche Erweiterung 😉



  • Nützlich hin oder her, von Compilerspezifischen Erweiterungen (solange sie nicht zwingend erforderlich sind) halte ich eigentlich nichts.


Anmelden zum Antworten