2014-09-24 100 views
0

讓我開始說我知道這是一種很時髦的編程方式,但我的老師要求我們這樣做。動態分配內存給結構數組C++

另請參見: 我CANT使用std :: string,類,此項目的構造函數。 我需要使用這種陳舊的C風格字符串方法,並在結構外部發生動態內存分配..我知道它不是最好的方式去做這件事,但是我可以去。 :(

進出口套牢的結構,我找不出什麼錯..

我有一個結構

#include <iostream> 
#include <fstream> 
#include <ctime> 
#include <stdlib.h> 
#include <string> 

using namespace std; 

//global constant(s) 
const int maxCards = 52; 

//Structs 
struct card 
{ 
    char *suit; 
    char *rank; 
    int cvalue; 
    char location; 
}; 

//Function List 
void readPlayers(player *peoplePointer); 
void shuffleCards(card *unshuffled, card* shuffled); 

//program 
int main() 
{ 
    //create pointer and set initial value 
    card * deckPointer = new card[52]; 
    card *deckHome = &deckPointer[0]; 
    for(int i=0;i<maxCards;i++) 
    { 
     (*deckPointer).suit=new char[8]; 
     (*deckPointer).rank = new char[7]; 
     deckPointer++; 
    } 
    deckPointer = deckHome; 
    cardInit(deckPointer); 
    readDeck(deckPointer); 

    //sets default values for the card arrays 
    for(int i=0;i<52;i++) 
    { 
     strcopy((*deckPointer).suit,"suit"); 
     strcopy((*deckPointer).rank,"rank"); 
     (*deckPointer).cvalue = 0; 
     deckPointer++; 
    } 
    deckPointer = deckHome; 
    return 0; 
} 

//Functions 
void cardInit(card *deckPointer) 
{ 
    card * deckHome = NULL; 
    deckHome = &deckPointer[0]; 
    //set up card file to be read in 
    ifstream fin; 
    char *finName = new char[13]; 

    //get file name from user 
    cout << "Enter file name...(cardFile.txt)" << endl;; 
    cin >> *finName; 

    //open the file 
    fin.open(finName); 

    //check if cardFile.txt opens correctly 
    if(!fin.good()) 
    { 
     cout << "Error with card file" << endl; 
    } 
    else 
    { 
     deckPointer = deckHome; 
     while(fin.good()) 
     { 
      for(int i=0;i<50;i++) 
      { 
       fin >> (*deckPointer).suit; 
       fin >> (*deckPointer).rank; 
       fin >> (*deckPointer).cvalue; 
       deckPointer++; 
      } 
     } 
    } 
    delete [] finName; 
} 

    //Its a pretty simple program..and my dynamic memory works for 
    //the file name, but I cant figure out why it doesnt work for structs? 
+0

請發佈一個完整的但減少到最小的例子。真實的代碼。並解釋問題。 – 2014-09-24 18:49:49

+1

你不應該動態分配你不需要動態分配的東西。例如'(* deckPtr).suit = new char [8]'和'(* deckPtr).rank = new char [7]'。縮進也使得閱讀代碼變得非常困難。 – Jason 2014-09-24 18:53:14

+0

使用變量名稱,告訴您是否有指向卡組的指針或指向卡的指針。我想你在混合起來。我會有一個甲板指針,然後像迭代器一樣使用卡片指針。 – 2014-09-24 18:59:43

回答

0

爲您的代碼工作,你需要一個類型名卡。

爲此,您需要設置如下:

struct cardstruct { 
    char *suit; 
    char *rank; 
    int cvalue; 
}; 

typedef struct cardstruct card; 

否則,當你聲明指針,你需要先使用「struct」keword。 E.G .:

struct card *deckPtr = new struct card[52]; 
+1

這在C++中不是必需的。 http://stackoverflow.com/questions/612328/difference-between-struct-and-typedef-struct-in-c – dari 2014-09-24 19:00:11