Zeiger auf Struktur weiterschalten; malloc(); realloc();



  • ...



  • Hallo rhkb danke für die schnelle Antwort.
    Wie du schon vorausgesehen hast, dein Programm-Code stürzt ab.
    Der Compiler hat bereits meinen Code übersetzt und keinen Fehler gefunden. Ich verwende das Programm "Microsft Visual Studio", deshalb verwende ich auch einige
    Microsoft-spezifische Funktionen.

    Ich habe jetzt mein Programm wie folgt umgeschrieben: (in der Header-Datei befinden sich alle notwendigen Bibliotheken)

    #include "header_malloc.h"
    #define HEAP_Faktor 1
    
    typedef struct 
    {
    	char Geräte_Beschreibung[4000];
    	long int Geräte_Nummer;
    	int Stückzahl;
    }Liste;
    
    Liste * Einlesen(int *Anzahl); 
    void Ausgeben(Liste *, int); 
    
    void main()
    {
    Kopf(); 
    Liste *buffer;
    int nummer=1;
    int *zeiger;
    zeiger=&nummer;
    printf("%31s  = %d\n\n","<HEAP_Faktor ",HEAP_Faktor); 
    buffer= Einlesen(zeiger);
     Ausgeben(buffer,nummer); 
    }
    
    Liste * Einlesen(int *nummer)
    {
    int max;
    max=sizeof(Liste);
    Liste *buffer;
    buffer	=(Liste*) malloc(HEAP_Faktor*max); 
    if(buffer==NULL)
    {
    printf("%51s\n","malloc<>-Meldung: Nicht gen\x81gend HEAP vorhanden!"),free(buffer);exit(1); 
    }
    
    printf("%34s = %p\n","**** HEAP-Adresse f\x81r 1. Ger\x84t",buffer); 
    printf("%24s%s =%12d Bytes","**** HEAP-Gesamtgr\x94\xE1","e",_msize(buffer)); 
    
    do
    {
    	printf("\n\n %d. Ger\x84t",*nummer);
    	if(*nummer>1&&_msize(buffer)-(*nummer-1)*max==0)	
    	{
    	buffer=(Liste *) realloc(buffer,_msize(buffer)+max*HEAP_Faktor);	
    	printf("%s%p"," <...HEAP wurde verschoben nach Adr ",buffer); 
    	printf("\n%34s%s%6d Bytes","...neue HEAP-Gesamtgr\x94\xE1","e     =",_msize(buffer)); 
    	printf("\n%41s%6d Bytes\n","...noch freier HEAP-Speicher =",_msize(buffer)-((*nummer-1)*max)); 
    
    	}
    	printf("\n%33s"," - Bezeichung <Ende mit \"0\">: "); 
    	scanf_s("%18s",(buffer+(*nummer-1))->Geräte_Beschreibung,4000); 
    	fflush(stdin);
    	if((buffer+(*nummer-1))->Geräte_Beschreibung[0]=='0') break;
    	else
    	{
    
    		printf("%21s","- Ger\x84te_Nummer: "); 
    		scanf("%li",&(buffer+(*nummer-1))->Geräte_Nummer);		
    		fflush(stdin); 
    		printf("%14s","- Bedarf: ");				
    		scanf("%d",&(buffer+(*nummer-1))->Stückzahl);
    		fflush(stdin);
    		(*nummer)++;
    		printf("%37s%d Bytes","...freier HEAP_Speicher = ",_msize(buffer)-((*nummer-1)*max)); 	
    	}
    
    }while(1);
    return buffer; 
    }
    
    void Ausgeben(Liste *t, int nummer)
    {
    
    printf("\n\n Einkaufliste:");
    printf("\n =============");
    printf("\n\n Pos. Ger\x84tebezeichung Nummer Bedarf");
    printf("\n -------------------------------------");
    int k=0; 
    for(int i=1; i<nummer;i++,k++)
    {
    
    	printf("\n%3d%19s%7li%5i",i,(t+k)->Geräte_Beschreibung,(t+k)->Geräte_Nummer,(t+k)->Stückzahl);
    
    }
    printf("\n\n-----------------------------------------------------------------------\n");
    }
    

    Auf diese Lösungen bin ich aber nur durch langes Probieren gekommen.
    Könnte mir jemand eine Lösung zeigen wie ich es ledeglich mit den Zeigern buffer,pp klappt?

    #Wutz: Danke für den Tipp, aber ich habe mich hier eig. nicht angemelden um mein herausragendes Deutsch an den Mann zu bringen. 😉



  • ...



  • Was soll denn dieser aufgeblähte Müll?
    Willst du zeigen, dass du eine simple Aufgabenstellung mit 262 Zeilen Nicht-ANSI C Code erschlagen kannst?



  • ThomasWa. schrieb:

    verwende das Programm "Microsft Visual Studio",

    Dann arbeitest du mit dem C++ Compiler, d.h. arbeitest nicht mit C.
    Das wiederum heißt, dass du (und höchstwahrscheinlich dein Professor) nicht weißt, was du tust.
    C und C++ sind verschiedene Programmiersprachen und nur Anfänger/Fachbuchautoren/Hoch-/Dorfschullehrer behaupten was anderes.



  • ...



  • Hallo ThomasWa.

    Der Code ist in der jetzigen Form ziemlich für die Tonne.
    Wenn Du weiterhin darauf bestehst nicht konformes C zu verwenden, ist ein Forum für Standard C der falsche Platz für Dein Problem.
    Dann setz Dich mit Deinen Kommilitonen hin und Ihr kaut das gemeinsam durch.

    Ansonsten:
    Ich bin mir auch sicher, dass der - pardon - Undurchsichtige-Scheiss-Quelltext Ursache für Dein Problem ist.

    Wo ist denn das Problem ein Array durchzugehen?
    Du kannst Zeigerarithmetik benutzen, oder Arrayelemente über Ihren index ansprechen.

    #include <stdlib.h>
    #include <stdio.h>
    
    // Zeigerarithmetik
    void fill(int *p, int n, int val){
      while(n--)
        *p++ = val;
    }
    
    // Index
    void print(const int *p, int n){
      for(int i=0; i<n; ++i)
        printf("p[%d]=%d\n", i, p[i]);
    }
    
    int main(){
      const size_t n = 5;
      int *p = malloc(sizeof(int)*n);
      fill(p, n, 42);
      print(p, n);
      free(p);
    }
    


  • Nehme das folgende Programm als Lernhilfe für dich und deine Mitstreiter und nicht das Prof.Gefasel:

    http://ideone.com/H1wtp9

    #include <stdio.h>
    #include <stdlib.h>
    #ifdef __cplusplus
    #error ich bin ein depp
    #endif
    
    typedef struct
    {
      char beschreibung[20];
      long int nummer;
      int bedarf;
    } Geraet;
    
    int main()
    {
      Geraet *liste=0;
      int i=0;
      while(liste=realloc(liste,++i*sizeof*liste))
      {
        printf("\n%33s"," - Bezeichung <Ende mit \"0\">: ");
        scanf("%19[^\n]",liste[i-1].beschreibung); while(!feof(stdin)&&!ferror(stdin)&&getchar()!='\n');
        if(liste[i-1].beschreibung[0]=='0') break;
        printf("%21s","- Geräte_Nummer: ");
        if( 1!=scanf("%ld",&liste[i-1].nummer) ) break; while(!feof(stdin)&&!ferror(stdin)&&getchar()!='\n');
        printf("%14s","- Bedarf: ");
        if( 1!=scanf("%d",&liste[i-1].bedarf) ) break; while(!feof(stdin)&&!ferror(stdin)&&getchar()!='\n');
      }
      --i;
      while(i--)
        printf("\n%3d%19s%7li%5i",i+1,liste[i].beschreibung,liste[i].nummer,liste[i].bedarf);
      free(liste);
      return 0;
    }
    

    Es ist standardkonform (suche via Google, was das bedeutet), kurz und verfügt sogar über einfache Fehlerbehandlungen.



  • Super! Dankeschön 🙂



  • Wutz schrieb:

    Nehme das folgende Programm als Lernhilfe für dich und deine Mitstreiter und nicht das Prof.Gefasel:

    http://ideone.com/H1wtp9

    #include <stdio.h>
    #include <stdlib.h>
    #ifdef __cplusplus
    #error ich bin ein depp
    #endif
    
    typedef struct
    {
      char beschreibung[20];
      long int nummer;
      int bedarf;
    } Geraet;
    
    int main()
    {
      Geraet *liste=0;
      int i=0;
      while(liste=realloc(liste,++i*sizeof*liste))
      {
        printf("\n%33s"," - Bezeichung <Ende mit \"0\">: ");
        scanf("%19[^\n]",liste[i-1].beschreibung); while(!feof(stdin)&&!ferror(stdin)&&getchar()!='\n');
        if(liste[i-1].beschreibung[0]=='0') break;
        printf("%21s","- Geräte_Nummer: ");
        if( 1!=scanf("%ld",&liste[i-1].nummer) ) break; while(!feof(stdin)&&!ferror(stdin)&&getchar()!='\n');
        printf("%14s","- Bedarf: ");
        if( 1!=scanf("%d",&liste[i-1].bedarf) ) break; while(!feof(stdin)&&!ferror(stdin)&&getchar()!='\n');
      }
      --i;
      while(i--)
        printf("\n%3d%19s%7li%5i",i+1,liste[i].beschreibung,liste[i].nummer,liste[i].bedarf);
      free(liste);
      return 0;
    }
    

    Es ist standardkonform (suche via Google, was das bedeutet), kurz und verfügt sogar über einfache Fehlerbehandlungen.

    offensichtlich kann man auch standardkonformen müll programmieren.
    insofern ist es in der tat eine lernhilfe, nämlich, wie man es nicht machen darf.
    um mal die wesentlichen punkte zu nennen:

    der code kann ein speicherleck verursachen, bedingt durch dilettantische benutzung von realloc.
    der code enthält umständliches indizierungs/dekrementierungsgefrickel.

    um tipparbeit zu sparen, verweise ich bezüglich der korrekten benutzung von realloc auf
    http://stackoverflow.com/questions/3331221/what-is-the-correct-usage-of-realloc-when-it-fails-and-returns-null
    und auf
    http://www.c-plusplus.net/forum/206606


Anmelden zum Antworten