Speicherzugriffsfehler unter Verwendung von int-array in einem struct!



  • Guten Tag Gemeinde!

    Mein Problem besteht darin, dass ich in einem Struct ein Integer-Element als Array deklariert habe.

    struct kunde 
    {
    	int kundennr; 
    	int kontostand;
    	int aktien_anz[7];
    };
    

    In der Main-Funktion habe ich eine Variable user[100] deklariert, welche ich auch als Parameter an diese Funktion übergeben.
    Nun möchte ich in einer Funktion auf den int-array zugreifen.

    int kaufe(char eingabe[], struct kunde user[], struct handel wertpapier[], char *parameter1, char parameter2[], int *aktuell_ptr, int *eingeloggt_ptr, int *auswertung_ptr)
    {
            int i;
    	int produkt = 0;
    	if(strcmp(eingabe, "kaufe\n"))
    	{
    		if(*eingeloggt_ptr == 0) printf("Sie sind nicht angemeldet!");
    		else
    		{
    		*auswertung_ptr = wertpapiercheck(wertpapier, parameter1);
    
    			if(strlen(parameter1) > 20 || *auswertung_ptr < 0) printf("Wertpapiername ist ungueltig!");
    			else
    			{
    				if(atoi(parameter2) == 0 || atoi(parameter2) < 0) printf("Bitte eine zulaessige Stueckzahl angeben!");
    				else
    				{
    					produkt = (atoi(parameter2))*(wertpapier[*auswertung_ptr].kurs);
    					if((user[*aktuell_ptr].kontostand - produkt) < 0) printf("Kontostand reicht nicht aus!");
    					else
    					{
    						user[*aktuell_ptr].aktien_anz[*auswertung_ptr] += atoi(parameter2);
    						user[*aktuell_ptr].kontostand -= produkt;
    					}
    
    					for(i=0;i<7;i++)
    					{
    					printf("Name: %s, Anzahl: %d, Kurs: %d\n", wertpapier[*auswertung_ptr].name, user[*aktuell_ptr].aktien_anz[i], wertpapier[i].kurs);
    					}
    				}
    			}
    		}
    	}
    	else printf("Ungueltiger Befehl!");
    
    	return user[*aktuell_ptr].kontostand;
    }
    

    *aktuell_ptr ist eine Zählvariable, anfangs ist der Wert 0 und wird bei jedem Anmelden um eins hochgezählt. Die Funktion wertpapiercheck überprüft lediglich den namen, welches wertpapier eingegeben wurde und gibt die entsprechende zahl zurück. -1 bis 6. Diese wird dann in *auswertung_ptr geschrieben.

    unter MacOS funktioniert dieser Code einwandfrei. Ich kompiliere mit gcc -Wall -Wextra -pedantic -std=c99! Fehlerfrei...
    Beim Ausführen des Programms unter Linux mit gleichem Compiler und gleichen Parametern, bekomme ich jedoch einen Speicherzugriffsfehler. Ich suche jetzt schon eine Weile nach dem Fehlerhaften Speicherzugriff, kann ihn aber leider nicht auffinden.
    Wäre nett wenn da mal ein anderes Augenpaar draufschauen könnte, vll. fällt der Fehler ja direkt auf.

    Vielen Dank fürs drüberlesen und ein schönes Wochenende 🙂



  • Oh Gott.. ein paar Bitten hätte ich da noch:

    1. cpp tags (Farbe usw ;))
    2. Ordentlich einrücken
    3. Gewisse Zeilenlänge nicht überschreiten (zB. 100, am besten 80 :D)

    Dann kann man (ich?!) das auch lesen 😉



  • sorry 🙂

    struct kunde 
    {
    	int kundennr; 
    	int kontostand;
    	int aktien_anz[7];
    };
    
    int kaufe(char eingabe[], struct kunde user[], struct handel wertpapier[], char *parameter1, char parameter2[], int *aktuell_ptr, int *eingeloggt_ptr,
     int *auswertung_ptr)
    {
    	int produkt = 0;
    	if(strcmp(eingabe, "kaufe\n"))
    	{
    		if(*eingeloggt_ptr == 0) printf("Sie sind nicht angemeldet!");
    		else
    		{
    		*auswertung_ptr = wertpapiercheck(wertpapier, parameter1);
    
    			if(strlen(parameter1) > 20 || *auswertung_ptr < 0) printf("Wertpapiername ist ungueltig!");
    			else
    			{
    				if(atoi(parameter2) == 0 || atoi(parameter2) < 0) printf("Bitte eine zulaessige Stueckzahl angeben!");
    				else
    				{
    					produkt = (atoi(parameter2))*(wertpapier[*auswertung_ptr].kurs);
    					if((user[*aktuell_ptr].kontostand - produkt) < 0) printf("Kontostand reicht nicht aus!");
    					else
    					{
    						user[*aktuell_ptr].aktien_anz[*auswertung_ptr] += atoi(parameter2);
    						user[*aktuell_ptr].kontostand -= produkt;
    					}
    
    					int i;
    					for(i=0;i<7;i++)
    					{
    					printf("Name: %s, Anzahl: %d, Kurs: %d\n", wertpapier[*auswertung_ptr].name, user[*aktuell_ptr].aktien_anz[i], wertpapier[i].kurs);
    					}
    				}
    			}
    		}
    	}
    	else printf("Ungueltiger Befehl!");
    
    	return user[*aktuell_ptr].kontostand;
    }
    


  • wertpapier[i].kurs ? Ist das ein Array der genauso viele Elemente wie dein Structelement hat?



  • Warum überprüfst du IN der Funktion "kaufe" ob die Eingabe "kaufe" ist?
    Gibt strcmp nicht 0 zurück wenn die Strings gleich sind?



  • jap!



  • doch gibt 0 zurück... da hatt ich en fehler gemacht, danke! ich überprüfe das nochmal da, weil ich in der main nur prüfe ob der eingabewert in dem string vorhanden ist (mit strstr). Dann rufe ich die entsprechende Funktion auf. in der funktion check ich dann nochmal ob auch wirklich dieses wort eingegeben wurde.


Anmelden zum Antworten