Struct dem Unterprogramm übergeben in C?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Struktur muss bekannt sein, bevor man diese verwendet.

Wenn du mit Zeigern arbeitest, verwende den richtigen Operator.

Wenn deine Funktion einen Zeiger verwenden, übergibst du einfach den Zeiger.

Wenn du Speicher allokierst, musst du diesen auch wieder frei geben.

http://pastebin.com/XNverdfN

War das bei Pointern nicht mit pointer->Wert ? Also den Zeiger ohne Stern, Minus Größer und dann das Strukturelement.

Allgemeine Fragen zu C++ und Fehlersuche?

Hallo zusammen,

gestern habe ich mit C++ angefangen. Jahrelang habe ich nur mit Basic programmiert.

Nun hatte mein gelbes Buch die Aufgabe gestellt, ein einfaches Programm zu erstellen, welches ein Nahrungsmittel einspeichert sowie die Kalorien. Diese sollen dann auch ausgegeben und zusätzlich in Joule umgerechnet werden.

#include <iostream>
#include <cstring>

using namespace std;

class Nahrungsmittel {
  private:
    char *Name;
    int kcal;

    void setName(char name[]);
    void setkcal(int Kalorien);

  public:
    Nahrungsmittel(char *N,int Kalorieren) {
      Name = new char(strlen(N) + 1); // +1 Für die Binäre Null am Ende !!
      strcpy(Name, N);
      kcal = Kalorieren;
    }

    ~Nahrungsmittel() {
      delete[] Name;
    }

    char getName() {
      return reinterpret_cast<char>(*Name);
    }

    int getkcal() {
      return kcal;
    }

    double getJoul() {
      return kcal * 4.1868;
    }
};

void Nahrungsmittel::setName(char *n) {
  Name = n;
}
                                            
void Nahrungsmittel::setkcal(int Kalorien) {
  kcal = Kalorien;
}
    
int main() {
  Nahrungsmittel Brot("Brot", 120);
  Nahrungsmittel Apfel("Apfel", 80);
  cout << "\nNahrung:" << Brot.getName() << " hat " << Brot.getkcal() << " Kalorien -> " << Brot.getJoul() << " Joul.";
  cout << "\nNahrung:" << Apfel.getName() << " hat " << Apfel.getkcal() << " Kalorien -> " << Apfel.getJoul() << " Joul.";
  return 0;
}        

Nur habe ich jetzt ein paar Fragen und bräuchte Hilfe bei einem Fehler.

Zuerst einmal dachte ich mir, da ich nicht weiß, wie groß der Name ist, dass ich über den Konstruktor den Namen übergeben lasse, und daraufhin den Speicher erst erstelle. Doch wenn ich den Namen übergeben lassen will, kommt nur der erste Buchstabe (Sorry, aber dass ganze mit Pointer und Adressen ist noch relativ verwirrend am Anfang^^).

Dann die nächste:

Im Buch wird geschrieben dass die Funktionen selber nicht in die Klassen kommen. In diesen Stehen nur die Prototypen. -> Dass verstehe ich überhaupt nicht. Vielleicht weil ich im Moment auch nur in einem File arbeite. Aber wenn ich mir einen Header einbinde, dann habe ich ja auch alle Funktionen darin enthalten. Oder sitzen die Funktionen im Header auch nicht in der Klasse und werden außerhalb deklariert?

  1. Wo liegt der Fehler dass der Name nicht richtig zurückgegeben wird?
  2. Gehört das zum ISO-Standard, dass in der Klasse nur Prototypen stehen, und die Funktion selber außerhalb definiert werden? Bzw. bringt dass Nachteile wenn ich die Funktion direkt in der Klasse erstelle?
  3. Allgemein der Code den ich da geschrieben habe.

LG

...zur Frage

Unicode/ASCII in C mit printf() in der Konsole darstellen.

Servus, ich möchte mit der printf()-Funktion Unicode/ASCII in der Konsole darstellen (Programmiersprache: C). ASCII wird problemlos dargestellt, bei Unicode werden fehlerhafte Zeichen dargestellt bzw. nicht die Zeichen, die ich möchte.

#include <stdio.h>
#include <stdlib.h>

int main()
{
    printf("AE: \x8E\n");
    printf("OE: \x99\n");
    printf("UE: \x9A\n");
    printf("SS: \xE1\n");
    char h_doubleline = '\u2550';
    char v_doubleline = '\u2551';
    printf("Doppelte horizontale Linie: %c\n", h_doubleline);
    printf("Doppelte vertikale Linie: %c\n", v_doubleline);
    int input = getchar(); //Eingabeanfrage, damit das Programm nicht beendet wird.
    return 0;
}

Wie kann ich Unicode richtig einfügen, sodass die richtigen Zeichen angezeigt werden? MfG.

...zur Frage

Welches Buch soll ich lesen um meine Informatik-Kenntnisse zu verbessern?

von Computern an sich (Geschichte + Funktionsweise) weiß ich mittlerweile mehr als genug, jedoch bin ich auch hier für vorschläge offen

ich meine eher

  • (Computer)-Netzwerkysteme
  • Serversystem (alle Serverarten die es so gibt)
  • Frage: Wieso gibt es nicht eine Programmiersprache, an der seit jeher rumgeschraubt wird, warum gibt es tausende und warum werden in verschiedensten bereichen immer typischer weise die immer gleichen sprachen verwendet --> warum C++ für das, warum C# für dies usw.
  • nochmal zum ersten, den comutern an sich, ich weiß wie gesagt schon sehr viel, aber wie ein chip (cpu) im detail funktioniert, also wie genau er eine prgrammiersprache mit seinem befehlssatz usw interpretiert etc das ist mir noch nicht so ganz klar.
  • wie genau werden cpu's gebaut, dass da zig millarden transistoren draufpassen und wer hat das erfunden? --> meines wissens nach brachte intel den ersten prozessor raus, der programme von externen speichern ausführen konnte. wie also konnten das andere firmen wie amd z.b. dann einfach so übernehmen, intel hat doch bestimmt nichts an infos rausgerückt.

ihr dürft ruhig gnadenlos in die tiefe gehen, mir egal, ich will es ja wissen

...zur Frage

Warum brauche ich bei scanf das \n? Wozu ist das gut?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TEXTSIZE 20
 
typedef struct LISTENEINTRAG {
  char szText[TEXTSIZE];
} LISTENEINTRAG;
 
typedef struct {
  LISTENEINTRAG eintrag[3];
  int index;
  int iGroesse;
} LISTE;
 
void push(LISTE* Liste, char szText[TEXTSIZE]) {
  // ->szText
  strcpy(((Liste->eintrag + Liste->index)).szText, szText);
  Liste->index++;
  printf("Neue Groesse %li byte.\n", sizeof(Liste));
}
 
void pop(LISTE* Liste) {
  Liste->index--;
  printf("Eintrag gefunden mit Text: %s", ((Liste->eintrag + Liste-> index)).szText);
  strcpy(((Liste->eintrag + Liste->index)).szText, "");
  printf("Neue Groesse %li byte.\n\n", sizeof(Liste));
}
 
int main() {
  LISTE Liste;
  Liste.iGroesse = sizeof(Liste);
  Liste.index = 0;
 
  char puffer[TEXTSIZE];
  char* c = NULL;
  int iWeiter = 0;
 
  do {
    printf("Neuer Eintrag (1) oder beenden (0)?\n");
    scanf("%i\n", &iWeiter);

    if (iWeiter) {
      printf("Zu speichernden Text eingeben: ");
      fflush(stdin);
      c = fgets(puffer, TEXTSIZE, stdin);

      if (c == NULL) {
        return 1;
      }

      push(&Liste, puffer);
    }
  } while (iWeiter);
   
  do {
    pop(&Liste);
  } while (Liste.index > 0);

  return 0;
}

Warum brauche ich bei

scanf("%i\n", &iWeiter);

das \n? Wozu ist das gut?

...zur Frage

Visual Studio C++ eingabe und ausgabe eines Buchstaben

include

include

int main (void) { char B; int i;

printf("Geben Sie einen Buchstaben ein:"); scanf_s("%s",&B); printf("Der eingegebene Buchstabe war: %s\n",B); system("Pause"); return 0; }

Bei diesem Programm kann ich zwar einen Buchstaben eingeben,aber es wird mir keiner ausgegeben. Da steht dann der Buchstabe wäre (null). Was mach ich falsch, bei meinen Kommilitonen klappts mit genau dem selben Programm...

...zur Frage

Programmieren (Java) verschiedene Begriffe erklärung?

Was sind:

-Tokens

-Bezeichner

-Ausdrücke

-Ausdrucksanweisungen

Wäre echt nett, wenn mir einer diese 4 begriffe verständlich erklärt LG

...zur Frage

Was möchtest Du wissen?