Lower Most , Left Most - benutzen von malloc & struct



  • Okay, habe jetzt &ptr[i+1] und ptr[j+1] abgeaendert, er gibt mir fuer y dann aber immer noch komische Werte aus. Z.b. - 423423425 o. Ae.

    Liegt es vielleicht daran das er eine Adresse liest anstatt dem Wert ?



  • Du scheinst mein Posting völlig ignoriert zu haben.



  • Bashar schrieb:

    s.u., Kommentare von mir

    Isengo4242 schrieb:

    [cpp]
    int main ( int argc, char argv[] ) { // char * argv[]

    int n;
    location *ptr;
    int i=1;
    int j;
    int miny;
    int minx;

    FILE *fin;
    fin = fopen ( "points.txt", "r");

    fscanf ( fin, "%d", &n );

    ptr = malloc ( n * sizeof(location) );

    while(i <= n ){
    fgetc(fin); // wozu das? , habe gelsen das er dann eine neue Zeile aufnimmt, hab es mal rauskommentiert und es hat keinen effekt...
    fscanf(fin, "%d%d", &ptr[i].x,&ptr[i+1].y); // warum einmal i, einmal i+1? Hat sich ja eben geklaert.
    i++;

    } // BTW die Schleife läuft von 1 bis n,
    // ptr ist aber ein Array der Länge n, d.h. mit Indizes 0 bis n-1, das stimmt, hab ich geaendert!

    for (j=1; j<n; j++){ // sollte von 0 bis n-1 gehen, YES

    if (ptr[j].x<minx){ // minx ist nicht initialisiert , was meinst du mit initialisiert ?
    minx=ptr[j].x;

    if (ptr[j+1].y<miny) // miny ist auch nicht initialisiert
    miny=ptr[j+1].y;

    }
    }

    printf( "The Lower Most, Left Most Point is: x = %d and y = %d", minx, miny );

    }

    [/cpp]

    Sorry, hab ich eben erst gesehen.

    So sieht es gefixed aus, aber dann nimmt er als Lowest, Left Punkt aber -1 anstatt -3 , also scheint damit was nicht zu stimmen ...

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct {
      int x;
      int y;
    }location;
    
    /* I tried to create a function for Leftmost & Lowermost, but it wouldn't
       accept my array in combination with my struct */
    
    void main ( ) {
    
      int n;
      location *ptr;
      int i=0;
      int j;
      int miny;
      int minx;
    
      FILE *fin;
      fin = fopen ( "points.txt", "r");
    
      fscanf ( fin, "%d", &n );
    
      ptr = malloc ( n * sizeof(location) );
    
      while(i <= n-1 ){
        /* fgetc(fin);*/
        fscanf(fin, "%d%d", &ptr[i].x,&ptr[i].y); 
        i++;
    
      }
    
      for (j=0; j<n-1; j++){
    
        if (ptr[j].x<minx){
          minx=ptr[j].x;
    
          if (ptr[j].y<miny)
    	miny=ptr[j].y;
    
        }
      }
    
      printf( "The Lower Most, Left Most Point is: x = %d  and y = %d\n\n", minx,miny );
    
    }
    


  • Machen wir mal ein Beispiel mit deinen Daten:

    4
    4 6
    4 3
    4 2
    -1 3
    

    Du besorgst Speicher für 4 Elemente mit malloc. ok
    Dann liest du 4 und schreibst es nach ptr[1].x und 6 schreibst es nach ptr[2].y (die 2 wegen i+1)
    Dann liest du 4 und schreibst es nach ptr[2].x und 3 schreibst es nach ptr[3].y
    Dann liest du 4 und schreibst es nach ptr[3].x und 2 schreibst es nach ptr[4].y
    Dann liest du -1 und schreibst es nach ptr[4].x und 3 schreibst es nach ptr[5].y

    Alle Indizes >= 4 sind nicht existent. Und deine Koordinaten sind auf verschiedene Indizes verteilt.

    Und nochmal meine Frage:
    Welchen Wert hat miny/minx beim ersten Durchlauf?

    if (ptr[j].x<minx){ // welchen Wert hat minx bei j=1?
      minx=ptr[j].x;
    

    Wenn man einer Variablen das erste mal einen Wert zuweist, heißt das "initialisieren"



  • Isengo schrieb:

    So sieht es gefixed aus, aber dann nimmt er als Lowest, Left Punkt aber -1 anstatt -3 , also scheint damit was nicht zu stimmen ...

    Wo steht in deinen Daten denn -3?



  • Initialisieren beschreibt das "erste" gewünschte Befüllen mit sinnvollen Werten, um folgende Abgleiche oder Berechnungen zu ermöglichen.

    Wenn Du in C eine Integer-Variable nicht initialisierst (meist genügt ein = 0), ist der Wert zur Laufzeit "nicht definiert". Beim einen Lauf könnte 0 drin stehen, beim nächsten aber auch -12341503 oder 31337. Da das meistens keine sehr nützlichen Werte für Folgeoperationen sind, bietet sich für eine Minimumvariable ein sehr hoher Wert und für eine Maximumvariable ein sehr niedriger Wert an.
    Angenommen Dein Koordinatensystem solle begrenzt groß sein, beispielsweise bis maximal 999 vom Ursprung. Dann wären die min-Variablen sinnvollerweise mit

    int xmin = 999, ymin = 999;
    int ymin = -999, xmin = -999;
    

    Im Übrigen gehören Deklarieren, Initialisieren, und so typische Dinge wie Arrayzähler zu den aaaaaa - wait 4 it - bsoluten Basics und sollten klar sein, bevor man mit "echten" Programmen beginnt.

    Wenn Du Dich jetzt noch fragst, wieso Dein fclose (fin) nicht funktioniert - solange Du nicht mal abprüfst, ob die Datei auch wirklich geöffnet wurde, ist Dir ein geöffneter Readpointer in den meisten Fällen auch eher wurst.



  • Hier ist noch ein Fehler:

    for (j=0; j<n-1; j++){
    


  • PrettyX schrieb:

    int xmin = 999, ymin = 999;
    int ymin = -999, xmin = -999;
    

    Oder du nimmst die ersten Werte aus dem Array

    minx=ptr[0].x
    miny=ptr[0].y
    

    Dann bist du nicht eingeschränkt.
    Natürlich vor der Schleife und nach dem befüllen des Array.



  • Ich frage mich ob die Logik abseits der Syntaxfehler überhaupt richtig ist. Was ist denn "lower most - leftmost"?

    Isengo34342 schrieb:

    4 6
    4 3
    4 2
    -1 3

    Es kann (-1,2) oder auch (4,2) sein. Ich glaube eher letzteres, weil nirgends die Rede von einem Bounding-Rectangle war.



  • ppohlmann schrieb:

    Hier ist noch ein Fehler:

    for (j=0; j<n-1; j++){
    

    Wo ist denn dort der Fehler ?

    Also ohne jetzt die vielen Posts genau zu quoten antworte ich einfach mal drauf los.

    Das mit dem initialisieren hab ich mir schon von Anfang an gedacht, allerdings hab ich es dann ausser acht gelassen nachdem es wundersamer Weise funktioniert hat. Ich habe jetzt die Loesung mit: miny = ptr[0].y ... genommen, ging am schnellsten und ist wohl auch am Sinnvollsten.

    -3 steht in der textdatei die ich gespeichert habe, eventuell im Screenshot nicht sichtbar. Oder ich hatte sie dann schon geaendert, sorry.

    Wie man im Array zaehlt weiss ich, allerdings hat es wie gesagt Anfangs nur so funtioniert und ich war mir nicht ganz sicher mit dem struct, eventuell hatte das Einfluss darauf, dachte ich , haha

    Das ich das fclose theoretisch nicht brauche hatte ich mir auch erlesen, da ich ja nur Daten lese ( " r " ) und nicht schreibe. Naja, habs wohl in der Aufgabenstellung falsch verstanden.

    So weit funktioniert es jetzt, ich werde nachher noch ein wenig dran basteln und eine Funktion lowermost schreiben, irgendwie hatte das nicht geklappt mit dem struct, es wollte die ganze Zeit das ptr[0].x nicht annehmen, Compiler meinte das .x gehe nicht. Muss ich nachher nochmal nachlesen. Muss das Programm dann wohl jetzt so abgeben, auch wenn es wieder nur zu xx% fertig ist, besser als nichts.

    Ich bitte Rechtschreibfehler und Unaufmerksamkeit zu entschuldigen, ich sass dort von 21 Uhr bis Morgens um 7 Uhr dran ... Ab ins Bett nun ! ➡



  • wasIstDas schrieb:

    Ich frage mich ob die Logik abseits der Syntaxfehler überhaupt richtig ist. Was ist denn "lower most - leftmost"?

    Isengo34342 schrieb:

    4 6
    4 3
    4 2
    -1 3

    Es kann (-1,2) oder auch (4,2) sein. Ich glaube eher letzteres, weil nirgends die Rede von einem Bounding-Rectangle war.

    Es geht um den am weitesten LINKS & UNTEN liegenden Punkt. Sollte so richtig sein.



  • Hallo,
    ich habe eine Frage zu einer Funktion die ich schreiben moechte.

    Ich habe ja Speicher mit

    ptr = malloc ( n * sizeof(location) );
    

    reserviert die Groesse habe ich ja mit sizeof location angegeben

    typedef struct {
      int x;
      int y;
    }location;
    

    wie schreibe ich nun die Funktion, damit ich die Werte auch uebergeben kann, denn der Compiler meckert immer rum das ptr[].x oder ptr[].y keine gueltigen Werte sind ?

    Meine Idee war :

    int vector ( int * ptr[], int n )
    int vector ( int ptr[].x, int ptr[].y , int n )
    

    Aber beides funktioniert nicht... 😞 Muss ich die struct definition vielleicht nochmal in die Funtion einfuegen ???

    EDIT :

    Nach 1 Stunde rumprobieren und kapieren das location jetzt ein Type ist , hier das fertige Programm:

    /***************************************************************/ 
    /* Programmer: Micha Hobert                                    */ 
    /*                                                             */ 
    /* Program 14: Lowermost and Leftmost                          */ 
    /*                                                             */ 
    /* Approximate completion time:   5 hours                      */ 
    /***************************************************************/ 
    
    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct {
      int x;
      int y;
    }location;
    
    void vector ( location ptr[] , int n ) {
    
      int j;
      int miny;
      int minx;
      minx = ptr[0].x;
      miny = ptr[0].y;
    
      for (j=0; j<n-1; j++){
    
        if (ptr[j].x<minx){
          minx=ptr[j].x;
    
          if (ptr[j].y<miny)
    	miny=ptr[j].y;
    
        }
      }
    
    printf( "The Lower Most, Left Most Point is: x = %d  and y = %d\n\n", minx,miny );
    
    }
    
    /* I tried to create a function for Leftmost & Lowermost, but it wouldn't
       accept my array in combination with my struct */
    
    int main ( ) {
    
      int n;
      location *ptr;
      int i=0;
    
      FILE *fin;
      fin = fopen ( "points.txt", "r");
    
      fscanf ( fin, "%d", &n );
    
      ptr = malloc ( n * sizeof(location) );
    
      while(i <= n-1 ){
        /* fgetc(fin);*/
        fscanf(fin, "%d%d", &ptr[i].x,&ptr[i].y); 
        i++;
    
      }
    
    vector ( ptr , n );
    
      return 0;
    
    }
    

Anmelden zum Antworten