Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

Hi,

Ich bin neu hier und habe ein Problem mit meinem Programm.

Das Programm soll aus einer in Arrays (sas1-8) eingelesenen Tabelle (8*22 Felder) die Differenzen von den Werten der benachbarten Spalten berechnen. Also Feld (0,0) - Feld (0,1) z.B. und das nur dann, wenn in keinem der beiden Felder 100 drinsteht. (if-BEdingung).

Das Programm läuft zwar (die Zahlen in der Tabelle werden auch richtig eingelesen), aber die FOR-Schleife, in der die Differenzen berechnet werden, wird NICHT durchlaufen (zumindest zeigt er mir das STOP (rote Zeile) nicht an). Ich weiß einfach nicht woran das liegt. Vllt könnt ihr mir das sagen.

Hier der Code:

#include <stdio.h>

#include <stdlib.h>


int main () {

int i;

int j;

int k;


printf("Start \n");

double *sas1;

double *sas2;

double *sas3;

double *sas4;

double *sas5;

double *sas6;

double *sas7;

double *sas8;

double *dg0;

double *dg1;

double *dg2;

double *dg3;

double *dg4;

double *dg5;

double *dg6;

// double *sasi;


sas1=(double*) malloc(22*sizeof(double));

sas2=(double*) malloc(22*sizeof(double));

sas3=(double*) malloc(22*sizeof(double));

sas4=(double*) malloc(22*sizeof(double));

sas5=(double*) malloc(22*sizeof(double));

sas6=(double*) malloc(22*sizeof(double));

sas7=(double*) malloc(22*sizeof(double));

sas8=(double*) malloc(22*sizeof(double));

dg0=(double*) malloc(22*sizeof(double));

dg1=(double*) malloc(22*sizeof(double));

dg2=(double*) malloc(22*sizeof(double));

dg3=(double*) malloc(22*sizeof(double));

dg4=(double*) malloc(22*sizeof(double));

dg5=(double*) malloc(22*sizeof(double));

dg6=(double*) malloc(22*sizeof(double));

// sasi=(double*) malloc(15*sizeof(double));


printf("Einlesen der Daten\n");


FILE *fdata;

fdata=fopen("tore","r");


for (i=0;i<22;i++) {

fscanf(fdata,"%lf",&sas1[i]);

fscanf(fdata,"%lf",&sas2[i]);

fscanf(fdata,"%lf",&sas3[i]);

fscanf(fdata,"%lf",&sas4[i]);

fscanf(fdata,"%lf",&sas5[i]);

fscanf(fdata,"%lf",&sas6[i]);

fscanf(fdata,"%lf",&sas7[i]);

fscanf(fdata,"%lf",&sas8[i]);

}


fclose(fdata);


printf("Einlesen beendet\n");

printf("Berechnung der Differenzen\n");


for (j=0;i<22;i++) {

  dg0[j]=0;

  [COLOR="Red"]printf("STOP\n");[/COLOR]

  if (sas1[j]==100) {dg0[j]=100; printf("stimmt \n");}

  if (sas2[j]==100) {dg0[j]=100; printf("stimmt2 \n");}

  else {dg0[j]=sas2[j]-sas1[j]; printf("stimmt3 \n");}


  dg1[j]=0;

  if (sas2[j]==100) {dg1[j]=100;}

  if (sas3[j]==100) {dg1[j]=100;}

  else {dg1[j]=sas3[j]-sas2[j];}


  dg2[j]=0;

  if (sas3[j]==100) {dg2[j]=100;}

  if (sas4[j]==100) {dg2[j]=100;}

  else {dg2[j]=sas4[j]-sas3[j];}


  dg3[j]=0;

  if (sas4[j]==100) {dg3[j]=100;}

  if (sas5[j]==100) {dg3[j]=100;}

  else {dg3[j]=sas5[j]-sas4[j];}


  dg4[j]=0;

  if (sas5[j]==100) {dg4[j]=100;}

  if (sas6[j]==100) {dg4[j]=100;}

  else {dg4[j]=sas6[j]-sas5[j];}


  dg5[j]=0;

  if (sas6[j]==100) {dg5[j]=100;}

  if (sas7[j]==100) {dg5[j]=100;}

  else {dg5[j]=sas7[j]-sas6[j];}


  dg6[j]=0;

  if (sas7[j]==100) {dg6[j]=100;}

  if (sas8[j]==100) {dg6[j]=100;}

  else {dg6[j]=sas8[j]-sas7[j];}

}


printf("Berechnung beendet\n");

printf("Ausgabe:\n");


for (k=0;k<22;k++) {

printf("k: %d \n", k);

printf("0: %lf \n",dg0[k]);

/*printf("1: %lf \n",dg1[k]);

printf("2: %lf \n",dg2[k]);

printf("3: %lf \n",dg3[k]);

printf("4: %lf \n",dg4[k]);

printf("5: %lf \n",dg5[k]);

printf("6: %lf \n",dg6[k]);

*/

}

/*printf("Schreiben der Ausgabedatei\n");


FILE *fdat;

fdat=fopen("plot.dat","w");


for (k=0;k<22;k++) {

  if (dg0[k]==100) {continue;}

  if (dg1[k]==100) {continue;}

  else{ fprintf(fdat,"%lf %lf",dg0[k], dg1[k]);

	fprintf(fdat,"\n");}


  if (dg1[k]==100) {continue;}

  if (dg2[k]==100) {continue;}

  else{ fprintf(fdat,"%lf %lf",dg1[k], dg2[k]);

	fprintf(fdat,"\n");}


  if (dg2[k]==100) {continue;}

  if (dg3[k]==100) {continue;}

  else{ fprintf(fdat,"%lf %lf",dg2[k], dg3[k]);

	fprintf(fdat,"\n");}


  if (dg3[k]==100) {continue;}

  if (dg4[k]==100) {continue;}

  else{ fprintf(fdat,"%lf %lf",dg3[k], dg4[k]);

	fprintf(fdat,"\n");}


  if (dg4[k]==100) {continue;}

  if (dg5[k]==100) {continue;}

  else{ fprintf(fdat,"%lf %lf",dg4[k], dg5[k]);

	fprintf(fdat,"\n");}


  if (dg5[k]==100) {continue;}

  if (dg6[k]==100) {continue;}

  else{ fprintf(fdat,"%lf %lf",dg5[k], dg6[k]);

	fprintf(fdat,"\n");}


}


fclose(fdat);


printf("Schreiben beendet\n");

*/

printf("Auftrag ausgeführt\n");


return 0;

}

Schonmal vielen Dank im voraus. Ich hoffe auf eine schnelle Antwort.

checko

Geschrieben

Moin.

FILE *fdata;

fdata=fopen("tore","r");

for (i=0;i<22;i++) {

...

}

fclose(fdata);

printf("Einlesen beendet\n");

printf("Berechnung der Differenzen\n");

for (j=0;i<22;i++) {

Und jetzt bitte mal genau hinschauen! :D :e@sy

Geschrieben

Hi TDM,

Ich verstehe nicht ganz, was du meinst mit

Den Rückgabewert von malloc castet man nicht.

Vielleicht kannst du mir es erklären. Das wäre sehr nett von dir.

Gruß

checko

Geschrieben
Vielleicht kannst du mir es erklären.
Ich kann's auch:

sas1=[COLOR="Red"](double*)[/COLOR] malloc(22*sizeof(double))

Der rot markierte Teil ist überflüssig, und kann in ganz bestimmten Situationen sogar dafür sorgen, dass statt eines (leicht zu behebenden) Compilezeitfehlers ein unangenehmer Laufzeitfehler auftritt.

Und wenn du jetzt sagst, dass dein Compiler den Code ohne diesen roten Teil nicht akzeptiert, muss ich dir antworten, dass du deinen C-Code durch einen C++-Compiler jagst ;)

Geschrieben

Hi TDM,

Wenn ich das also richtig verstehe, brauche ich das also deswegen nicht zu schreiben, weil der Datentap des Arrays gleichbleibt. Ist das so richtig?

@all: Ich möchte nochmal danke sagen, für all das, was ich hier schon gelernt habe.

checko

Geschrieben
Wenn ich das also richtig verstehe, brauche ich das also deswegen nicht zu schreiben, weil der Datentap des Arrays gleichbleibt. Ist das so richtig?

Nein. Die Funktion malloc gibt einen void-Zeiger zurück. Du weist das einem double-Zeiger zu. Die Umwandlung von void* nach double* ist in C implizit, das heißt, sie passiert automatisch. Die explizite Typumwandlung mit dem Cast ist daher überflüssig, weil ohne genau dasselbe passiert.

Geschrieben

Hi Klotzkopp,

Ich verstehe. Eine Frage habe ich aber noch:

Heißt das jetzt, dass ich das "double*" nie schreiben muss oder gibt es Situationen, in denen es doch notwendig ist?

checko

Geschrieben
Heißt das jetzt, dass ich das "double*" nie schreiben muss oder gibt es Situationen, in denen es doch notwendig ist?
Es gibt jede Menge vorstellbarer Situationen, in denen ein Cast auf double* notwendig sein kann. Merk dir einfach, dass so ein Cast niemals notwendig ist, wenn malloc und verwandte Funktionen im Spiel sind ;)
Geschrieben (bearbeitet)

Hi,

Ich habe hier noch ein anderes Problem. Der Input sind zwei 8*26 Tabellen aus zwei verschiedenen Dateien, die das Programm nacheinander einlesen soll.

Die Daten aus der ersten Datei liest er auch ohne Probleme ein. Doch die Daten aus der zweiten Datei werden komischer weise nicht mehr eingelesen, wie mir der Print-Befehl vor der Berechnung zeigt.

Angemerkt sei noch, dass die erste Zahl aus der zweiten Datei richtig eingelesen wird, alle anderen liest er aber nicht mehr ein.

Ihr habt mir schon einmal geholfen und ich würde mich freuen, wenn ihr es wieder tuen könntet.

Schon mal vielen Dank im Voraus.

checko

Hier der Code:


#include <stdio.h>

#include <stdlib.h>


int main () {

int i;

int j;

int k;

int a;

int b;


//Benötigte Größen

double sum1;

double sum2;

double sum3;

double sum4;

double sum5;

double sum6;

double sum7;

double sum8;


sum1=0;

sum2=0;

sum3=0;

sum4=0;

sum5=0;

sum6=0;

sum7=0;

sum8=0;


//Benötigte Arrays

printf("Start \n");

double *sas1;

double *sas2;

double *sas3;

double *sas4;

double *sas5;

double *sas6;

double *sas7;

double *sas8;

double *eta1;

double *eta2;

double *eta3;

double *eta4;

double *eta5;

double *eta6;

double *eta7;

double *eta8;

// double *sasi;


sas1=(double*) malloc(26*sizeof(double));

sas2=(double*) malloc(26*sizeof(double));

sas3=(double*) malloc(26*sizeof(double));

sas4=(double*) malloc(26*sizeof(double));

sas5=(double*) malloc(26*sizeof(double));

sas6=(double*) malloc(26*sizeof(double));

sas7=(double*) malloc(26*sizeof(double));

sas8=(double*) malloc(26*sizeof(double));

eta1=(double*) malloc(26*sizeof(double));

eta2=(double*) malloc(26*sizeof(double));

eta3=(double*) malloc(26*sizeof(double));

eta4=(double*) malloc(26*sizeof(double));

eta5=(double*) malloc(26*sizeof(double));

eta6=(double*) malloc(26*sizeof(double));

eta7=(double*) malloc(26*sizeof(double));

eta8=(double*) malloc(26*sizeof(double));

// sasi=(double*) malloc(15*sizeof(double));


printf("Einlesen der 1. Datei\n");


FILE *fdata;

fdata=fopen("tore","r");


for (i=0;i<26;i++) {

fscanf(fdata,"%lf",&sas1[i]);

fscanf(fdata,"%lf",&sas2[i]);

fscanf(fdata,"%lf",&sas3[i]);

fscanf(fdata,"%lf",&sas4[i]);

fscanf(fdata,"%lf",&sas5[i]);

fscanf(fdata,"%lf",&sas6[i]);

fscanf(fdata,"%lf",&sas7[i]);

fscanf(fdata,"%lf",&sas8[i]);

}


fclose(fdata);

printf("Einlesen der 1. Datei beendet\n");


printf("Einlesen der 2. Datei\n");


FILE *fdato;

fdato=fopen("etat","r");


for (a=0;a<26;a++) {

fscanf(fdato,"%lf",&eta1[a]);

fscanf(fdato,"%lf",&eta2[a]);

fscanf(fdato,"%lf",&eta3[a]);

fscanf(fdato,"%lf",&eta4[a]);

fscanf(fdato,"%lf",&eta5[a]);

fscanf(fdato,"%lf",&eta6[a]);

fscanf(fdato,"%lf",&eta7[a]);

fscanf(fdato,"%lf",&eta8[a]);

}


fclose(fdato);


for (b=0;b<26;b++) {

printf("S1: %lf, S2: %lf, S3: %lf, S4: %lf \n",eta1[b],eta2[b],eta3[b],eta4[b]);

printf("S5: %lf, S6: %lf, S7: %lf, S8: %lf \n",eta5[b],eta6[b],eta7[b],eta8[b]);

}


//Abhier kommt die weiterführende Berechnung, die hier nicht mehr wichtig ist. 

//Falls sie doch notwendig ist, setzte ich sie noch nachträglich rein.

PS: Ich habe schon gelernt, dass bei dem malloc-Befehl das (double*) überflüssig ist. Ich schreibe es aber aus Gewohnheit. :)

Bearbeitet von checko

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...