CC++Qt « Как передать указатель на структуру (в моем случае)?

Начал недавно изучать структуры.
Часть задания.
Формирование, печать, добавление и удаление элементов оформить в виде функций.
Как только начал оформлять в виде функции стал понимать, что ничего не знаю.
Вот мои наработки, и весь код.

/** * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann * (http://qbnz.com/highlighter/ and http://geshi.org/) */ .cpp.geshi_code {font-family:monospace;} .cpp.geshi_code .imp {font-weight: bold; color: red;} .cpp.geshi_code .kw1 {color: #0000ff;} .cpp.geshi_code .kw2 {color: #0000ff;} .cpp.geshi_code .kw3 {color: #0000dd;} .cpp.geshi_code .kw4 {color: #0000ff;} .cpp.geshi_code .co1 {color: #666666;} .cpp.geshi_code .co2 {color: #339900;} .cpp.geshi_code .coMULTI {color: #ff0000; font-style: italic;} .cpp.geshi_code .es0 {color: #000099; font-weight: bold;} .cpp.geshi_code .es1 {color: #000099; font-weight: bold;} .cpp.geshi_code .es2 {color: #660099; font-weight: bold;} .cpp.geshi_code .es3 {color: #660099; font-weight: bold;} .cpp.geshi_code .es4 {color: #660099; font-weight: bold;} .cpp.geshi_code .es5 {color: #006699; font-weight: bold;} .cpp.geshi_code .br0 {color: #008000;} .cpp.geshi_code .sy0 {color: #008000;} .cpp.geshi_code .sy1 {color: #000080;} .cpp.geshi_code .sy2 {color: #000040;} .cpp.geshi_code .sy3 {color: #000040;} .cpp.geshi_code .sy4 {color: #008080;} .cpp.geshi_code .st0 {color: #FF0000;} .cpp.geshi_code .nu0 {color: #0000dd;} .cpp.geshi_code .nu6 {color: #208080;} .cpp.geshi_code .nu8 {color: #208080;} .cpp.geshi_code .nu12 {color: #208080;} .cpp.geshi_code .nu16 {color:#800080;} .cpp.geshi_code .nu17 {color:#800080;} .cpp.geshi_code .nu18 {color:#800080;} .cpp.geshi_code .nu19 {color:#800080;} .cpp.geshi_code .me1 {color: #007788;} .cpp.geshi_code .me2 {color: #007788;} .cpp.geshi_code span.xtra { display:block; }

#include <iostream>
#include <fstream>
using namespace std;

typedef struct disk
{
    char name[30];
    char autor[30];
    float duration[30];
    int cost;
};
void addElements(struct disk, int);
int main()
{  
  ofstream fwrite("ofile.txt");
  ifstream fread("ofile.txt");
  int i, n;
              cout<<"How many disks do you wish to catalog?"<< endl;
              cin>>n;
  fread >> n;
              cin.ignore(1,'n');
              disk *pDisk = new disk[n];
              disk *ppDisk = pDisk;
  void addElements(&pDisk, n);
              pDisk = ppDisk;
 
  cout << "--------------------------------" << endl;
              cout << "Here is your collection: " << endl;;
             for (i = 0; i < n; i++)
             {
    cout << "--------------------------------" << endl;
    fread >> pDisk->autor;
    fread >> pDisk->name;
    fread >> pDisk->cost;
    cout << pDisk->autor << " " << pDisk->name << " "<< pDisk->cost << "$" << endl;
    for(int l=0; l<3; l++)
    {
      fread >> pDisk->duration[l];
      cout << "Duration of " << l+1 << " track is ";
      cout << pDisk->duration[l] << endl;
    }
   
        pDisk++;
    }
  delete [] ppDisk;
    return 0;
}
void addElements(struct disk, int n)
{
  for (int i = 0; i < n; i++)
    {  
                cout << "Disk #"<< i+1 <<':'<< endl;
       
    cout << "Please enter the name of disk: ";
                            cin.get(pDisk->name,30);
    fwrite << pDisk->name << endl;
       
    cout << "Please enter the year autor: ";
    cin >> pDisk->autor;
    fwrite << pDisk->autor << endl;

    cout << "Please enter the cost of disk: ";
    cin >> pDisk->cost;
    fwrite << pDisk->cost << endl;
    cin.ignore(1,'n');

    for (int k=0; k<3; k++)
    {
      cout << " Please enter the duration: " << k+1 << ": ";
      cin >> pDisk->duration[k];
      fwrite << pDisk->duration[k] << endl;
    }
        pDisk++;
    }
}
 

Как мне правильно написать функцию void addElements()

Гуглил, но void addElements(&pDisk, n); не работает, может я что-то не понимаю, помогите пожалуйста.

1 ответов


Я покромсал ваш код, чтобы показать как это работает :


#include <iostream>
#include <stdio.h>
using namespace std;

struct disk
{
    char name[30];
    char autor[30];
    float duration[5];
    int cost;
};
void addElements(disk**, int);
int main()
{

  int  n;
  cout<<"How many disks do you wish to catalog?"<< endl;
  cin>>n;
 
  disk** pDisk = new disk* [n];
  for (int i=0;i<n;i++)
    pDisk[i] = new disk;

  addElements (pDisk,n);
  printf ("Your collection:\n");
  for (int i=0;i<n;i++)
    {
      printf("%-30s %-30s %-3d\n",pDisk[i]->autor,pDisk[i]->name,pDisk[i]->cost);
      for (int j=0;j<3;j++)
        printf ("     %-8.2f\n",pDisk[i]->duration[j]);
    }


  for(int i=0;i<n;i++)
    delete pDisk[i];
  delete [] pDisk;
    return 0;
}
void addElements(disk** pDisk, int n)
{
for (int i = 0; i < n; i++)
    {
        cout << "Disk #"<< i+1 <<':'<<'\n';
        printf( "Please enter the name of disk: ");
        scanf("%s",&pDisk[i]->name);
        cout << "Please enter the year autor: ";
        scanf("%s",&pDisk[i]->autor);
        cout << "Please enter the cost of disk: ";
        cin >> pDisk[i]->cost;

        for (int k=0; k<3; k++)
        {
         cout << " Please enter the duration: " << k+1 << ": ";
            cin >> pDisk[i]->duration[k+1];
        }
    }
}
 

Вообще я бы на вашем месте не спешил со структурами, а разобрался в следующих темах :

  • Глобальные и локальные переменные, область жизни переменных
  • Типы данных
  • Указатели, работа с памятью
  • Функции в с++
  • Потоки
  • Ввод-вывод средствами библиотеки stdio.h


И только потом бы разбирался со структурами и пользовательскими типами данных.
Углубляясь в ваш код, хватаешься за голову. Такое ощущение что вы совсем не понимаете что делаете.

Если сигнатура


void addElements(struct* disk, int n);
 
то

addElements(&pDisk, n);
 
не работает ?

Попробуйте исправить следующее :

  • Вместо

    typedef struct disk
    {
        char name[30];
        char autor[30];
        float duration[30];
        int cost;
    };
     


    struct disk // для объявления структуры не нужен typedef
    {
        char name[30];
        char autor[30];
        float duration[30];
        int cost;
    };
     
  • Вместо

    void addElements(struct disk, int);
     

    void addElements(disk* pDisk, int); // в сигнатуре нужно указывать имя
    //объявленного типа, struct здесь не нужно
    // disk* pDisk - указатель на структуру disk
     
  • Обращение к i-ому элементу :

    pDisk[i]->duration
    pDisk[i]->name
     
    И так далее.
  • Вызов

    addElements(pDisk, n);