Illegal Instruction: 4



  • Hallo Leute 😃

    Warum bekomme ich beim folgenden Programm einen Illegal Instruction: 4 Fehler wenn ich am Anfang der Konsole 1 übergebe?

    #include <stdio.h>
    
    #define WIDTH 4
    #define LENGHT 12
    
    // Prototypen
    void paritaetVergleichenUndFehlererkennen(int bit1[],int bit2[]);
    void eintragen (int [LENGHT],int [][WIDTH]);
    void paritaetBerechnen(int bit_liste[],int binaerListe[][WIDTH]);
    void paritaetBerechnenUndFehlerEinbauen(int bit_liste[],int binaerListe[][WIDTH],int stelle);
    
    void main()
    {
        int fehler;
        int stelle;
        printf("Soll ein Fehler beim Übertragen passieren? ja = 1 nein = 0 ");
        scanf("%i", &fehler);
        if (fehler == 0) {
            printf("An welcher Stelle? (1 - 8) ");
            scanf("%i", &stelle);
            switch (stelle) {
                case 1:
                    stelle = 2;
                    break;
    
                case 2:
                    stelle = 4;
                    break;
    
                case 3:
                    stelle = 5;
                    break;
    
                case 4:
                    stelle = 6;
                    break;
    
                case 5:
                    stelle = 8;
                    break;
    
                case 6:
                    stelle = 9;
                    break;
    
                case 7:
                    stelle = 10;
                    break;
    
                case 8:
                    stelle = 11;
                    break;
    
            }
            int bit1[LENGHT] = {-1,-1,1,-1,0,1,0,-1,1,0,0,1};
            int bit2[LENGHT] = {-1,-1,1,-1,0,1,0,-1,1,0,0,1};
            int binaerListe[4][WIDTH];
    
            // Senden
            eintragen(bit1,binaerListe);
            paritaetBerechnen(bit1,binaerListe);
    
            // Empfangen
            eintragen(bit2,binaerListe);
            paritaetBerechnen(bit2,binaerListe);
    
            paritaetVergleichenUndFehlererkennen(bit1,bit2);
        }
        if (fehler == 1) {
            int bit3[LENGHT] = {-1,-1,1,-1,0,1,0,-1,1,0,0,1};
            int bit4[LENGHT] = {-1,-1,1,-1,0,1,0,-1,1,0,0,1};
            int binaerListe1[4][WIDTH];
    
            if (bit4[stelle] == 0) {
                bit4[stelle] = 1;
            } else {
                bit4[stelle] = 0;
            }
            // Senden
            eintragen(bit3,binaerListe1);
            paritaetBerechnen(bit3,binaerListe1);
    
            // Empfangen
            eintragen(bit4,binaerListe1);
            paritaetBerechnen(bit4,binaerListe1);
    
            paritaetVergleichenUndFehlererkennen(bit3,bit4);
        }
    }
    
    /*
     Es werden die Paritätsbits der zwei übergebenen Codes verglichen und überprüft, ob ein Fehler entstanden
     ist oder nicht. Falls ein Fehler entstanden ist, wird ausgegeben, wo der Fehler passiert ist.
     */
    void paritaetVergleichenUndFehlererkennen(int bit1[],int bit2[])
    {
    	int par1,par2,par3,par4;
    	int erg = 0,i;
    	par1 = bit1[0] ^ bit2[0];
    	par2 = bit1[1] ^ bit2[1];
    	par3 = bit1[3] ^ bit2[3];
    	par4 = bit1[7] ^ bit2[7];
    
    	if(par1||par2||par3||par4) {
            printf("Es ist ein FEHLER entstanden!");
    		printf("Der Fehler befindet sich an der Stelle %i %i %i %i\n",par4,par3,par2,par1);
        } else
    		printf("Es ist KEIN Fehler entstanden! \n");
        printf("Gesendet:  %i %i %i %i %i %i %i %i %i %i %i %i \n",bit1[0], bit1[1], bit1[2], bit1[3], bit1[4], bit1[5], bit1[6], bit1[7], bit1[8], bit1[9], bit1[10], bit1[11]);
        printf("Empfangen: %i %i %i %i %i %i %i %i %i %i %i %i \n",bit2[0], bit2[1], bit2[2], bit2[3], bit2[4], bit2[5], bit2[6], bit2[7], bit2[8], bit2[9], bit2[10], bit2[11]);
    }
    
    /*
     Berechnet für den übergeben Code die 4 Paritätsbits und fügt sie im Code ein.
     */
    void paritaetBerechnen(int bit_liste[],int binaerListe[][WIDTH])
    {
        bit_liste[0] = binaerListe[0][0] ^ binaerListe[1][0] ^ binaerListe[2][0];
        bit_liste[1] = binaerListe[0][1] ^ binaerListe[1][1] ^ binaerListe[2][1];
        bit_liste[3] = binaerListe[0][2] ^ binaerListe[1][2] ^ binaerListe[2][2];
        bit_liste[7] = binaerListe[0][3] ^ binaerListe[1][3] ^ binaerListe[2][3];
    }
    
    void eintragen (int liste[LENGHT],int binaerListe[3][WIDTH])
    {
    	int bin_liste[LENGHT][WIDTH] =
    	{
    		{0,0,0,1},
    		{0,0,1,0},
    		{0,0,1,1},
    		{0,1,0,0},
    		{0,1,0,1},
    		{0,1,1,0},
    		{0,1,1,1},
    		{1,0,0,0},
    		{1,0,0,1},
    		{1,0,1,0},
    		{1,0,1,1},
    		{1,1,0,0}
    	};
    
    	int i,j;
    	int k = 0;
    	liste[0] = -1;
    	liste[1] = -1;
    	liste[3] = -1;
    	liste[7] = -1;
    
    	for(i = 0; i < LENGHT; i++)
    	{
    		if(liste[i] == 1) {
    			for(j = 0; j < WIDTH && k < 4; j++) {
    				binaerListe[k][j] = bin_liste[i][j];
    			}
                k++;
            }
    	}
    }
    void paritaetBerechnenUndFehlerEinbauen(int bit_liste[],int binaerListe[][WIDTH],int stelle)
    {
        bit_liste[0] = binaerListe[0][0] ^ binaerListe[1][0] ^ binaerListe[2][0];
        bit_liste[1] = binaerListe[0][1] ^ binaerListe[1][1] ^ binaerListe[2][1];
        bit_liste[3] = binaerListe[0][2] ^ binaerListe[1][2] ^ binaerListe[2][2];
        bit_liste[7] = binaerListe[0][3] ^ binaerListe[1][3] ^ binaerListe[2][3];
    
        //if (binaerListe[stelle] == 0) {
       //     binaerListe[stelle] = 1:
       // } else {
         //   binaerListe[stelle] = 0;
        //}
    }
    

    Schonmal Danke 😃



  • Schau dir Zeile 8 an und vergleiche mit Z. 124 😕

    Und Z. 124 und folgende soll das so 😕

    Es gibt da sicher noch mehr oder 😕



  • Die Variable "stelle" wird in Zeilen 74 ff. uninitialisiert benutzt.



  • switch (stelle) {
                case 1:
                    stelle = 2;
                    break;
    
                case 2:
                    stelle = 4;
                    break;
    
                case 3:
                    stelle = 5;
                    break;
    
                case 4:
                    stelle = 6;
                    break;
    
                case 5:
                    stelle = 8;
                    break;
    
                case 6:
                    stelle = 9;
                    break;
    
                case 7:
                    stelle = 10;
                    break;
    
                case 8:
                    stelle = 11;
                    break;
    
            }
    

    Let me refactor that for you

    int lookup[] = {-1, 2, 4, 5, 6, 8, 9, 10, 11};
    stelle = lookup[stelle];
    


  • lmrtfy schrieb:

    Let me refactor that for you

    int lookup[] = {-1, 2, 4, 5, 6, 8, 9, 10, 11};
    stelle = lookup[stelle];
    

    Das ist keine so gute Idee wenn 'stelle' vorher vom User eingegeben wurde.



  • genau.
    erst gucken ob index gueltig


Anmelden zum Antworten