Problemas e duvidas com um programa em C

gryphus1

Membro
Boas.

Construi um programa de gestão de quartos de um hotel em C, que basicamente trabalha com uma matriz de elementos (quartos). Depois cada quarto tem alguns campos onde se guarda o seu preço, o seu numero e letra, e um possivel nome associado à sua reserva ou venda.

Implementei isto tudo da forma mais simples, usei o malloc(sizeof(struc ... )) para criar os quartos e a tabela de quartos e inicializei tudo direitinho...

Compila sem erros nem warnings.

Mas quando vou a executar em modo without debuging, o programa crasha depois da função de criação da tabela dos quartos se completar. De salientar que essa função newTableRooms também chama a função newRoom, que serve para criar cada quarto individual.
Heis uma imagem do erro que aparece:



Ah e se tento ignorar o erro depois aparece este:



Se deixo como está e executo em Debug mode, ele executa normalmente e não crasha uma única vez...


Para ser mais preciso, ele em without debuging executava o programa ate ao final desta função e depois crashava com os erros anteriores:


Código:
tRoom newSingleRoom(int l, char c,float p){
    tRoom r;    
    r=(tRoom)malloc(sizeof(struct Rooms));
    r->number=l;
    r->letter=toupper(c);
    r->price=p;
    r->nameForRoom=newName();    
    return r;
}
Ah e a pequena função "newName" está aki:


Código:
nPT newName(){
    nPT n;
    n=(nPT)malloc(sizeof(struct Names));        
    return n;
}
Já sei mais detalhes sobre o erro, ele acontece nesta função, e o erro refere-se à linha a vermelho...


Código:
void configTableRooms(char* filename, tTable t){
    FILE *file;
    int line;
    float price;
    char colunn;
    char phrase[13];
    char info[13];        
    [COLOR=red]file=fopen(filename, "r");[/COLOR]
    if (file==NULL)
        printf("Error found while reading from the Config.txt.\n");
    else{
        while (!feof(file)){            
            fgets(phrase, 13, file);
            strcpy(info,strtok(phrase, " "));
            sscanf(info, "%d%c",&line,&colunn);                
            strcpy(info,strtok(NULL, "\n"));
            sscanf(info, "%f",&price);                
            t->room[line][index(colunn)]=newSingleRoom(line,colunn,price);            
        }
        fclose(file);
    }
}
Código:
typedef struct Names{
    char Name[50];
} [COLOR=RED]*nPT;[/COLOR]


typedef struct Rooms{
    int number;
    char letter;
    float price;
    [COLOR=RED]nPT nameForRoom;[/COLOR]        
    enum situations situationRoom;
};
É assim que tenho as estruturas. O "nPT" passeio-o como apontador para a estrutura Names, só tenho dúvida se devo passar o campo "nameForRoom" também como um apontador para "nPT". Se o faço recebo alguns warnings.



Heis o erro da linha a vermelho:



Não aparece mais nenhuma output window. Se fizer break ele pára ali, se fizer continue ele continua a executar.



O que poderá ser?? Há horas que estou de volta disto e nao descubro...
 
Última edição:
Boas.

É assim que tenho as estruturas. O "nPT" passeio-o como apontador para a estrutura Names, só tenho dúvida se devo passar o campo "nameForRoom" também como um apontador para "nPT". Se o faço recebo alguns warnings.

Código:
typedef struct Names{
    char Name[50];
} [COLOR=RED]*nPT;[/COLOR]

Aqui já estas a definir como pointer, logo se na outra estrutura puseres um *, significa que é um duplo pointer, e provavelmente por isso te dar problemas de warning's.

Relativamente aos erros do visual studio, não percebo porque só te acontece em modo debug, mas esse tipo de erros normalmente acontece com problemas de gestão de memória.

Já agora aqui:
tRoom newSingleRoom(int l, char c,float p)
O que é o tRoom? não deverias estar a devolver um pointer para a zona de memória que acabaste de alocar?
 
Bem, eu testei esse código e apareceu-me logo um erro no
Código:
enum situations situationRoom;
Deve ter sido algum tipo que definiste e que não colocaste aqui.

Depois deu-me erro no tRoom. Não reconhece o tipo. E realmente, acho que não há nenhuma declaração de tRoom. Se calhar o que tu querias é que tRoom fosse um apontador para a struct Rooms. Ou seja, ficaria algo do género:
Código:
typedef struct Rooms{
    int number;
    char letter;
    float price;
    nPT nameForRoom;        
    enum situations situationRoom;
}*tRoom;
Vê lá se já consegues arranjar isso agora.

O resto dos erros é na função configTableRooms.
 
Última edição:
Ficheiro room.h:

Código:
#ifndef _H_room
#define _H_room


typedef struct Rooms *tRoom;

tRoom newSingleRoom(int,char,float);
...

foi assim que defini o tipo tRoom, como apontador para a estrutura Rooms
 
Colocas o *tRoom depois da declaração da struct que aquilo passa a ser reconhecido como um apontador para a struct. Desta forma nunca dá problemas!
 
Última edição:
Consegui resolver :)

Uma outra duvida que tenho é se posso adicionar cores ao programa ... ? Isto é, mudar as cores das letras que aparecem na janela preta.
 
Podes. Acho que tens de fazer
Código:
#include <windows.h>
mas não sei como se utiliza.

EDIT: Encontrei este código noutro fórum:
Código:
[COLOR=#339933]#include "stdio.h"[/COLOR]
[COLOR=#339933]#include "conio.h"[/COLOR]
[COLOR=#339933]#include "windows.h"[/COLOR]
 
 
[COLOR=#993333]void[/COLOR] setrgb[COLOR=#66cc66]([/COLOR][COLOR=#993333]int[/COLOR] color[COLOR=#66cc66])[/COLOR]
[COLOR=#66cc66]{[/COLOR]
  [COLOR=#b1b100]switch[/COLOR] [COLOR=#66cc66]([/COLOR]color[COLOR=#66cc66])[/COLOR]
  [COLOR=#66cc66]{[/COLOR]
  [COLOR=#b1b100]case[/COLOR] [COLOR=#cc66cc]0[/COLOR]:    [COLOR=#808080][I]// Branco sobre Preto[/I][/COLOR]
    SetConsoleTextAttribute[COLOR=#66cc66]([/COLOR]GetStdHandle[COLOR=#66cc66]([/COLOR]STD_OUTPUT_HANDLE[COLOR=#66cc66])[/COLOR],
                        FOREGROUND_INTENSITY | FOREGROUND_RED |
                        FOREGROUND_GREEN | FOREGROUND_BLUE[COLOR=#66cc66])[/COLOR];
    [COLOR=#000000][B]break[/B][/COLOR];
  [COLOR=#b1b100]case[/COLOR] [COLOR=#cc66cc]1[/COLOR]:    [COLOR=#808080][I]// Vermelho sobre Preto[/I][/COLOR]
    SetConsoleTextAttribute[COLOR=#66cc66]([/COLOR]GetStdHandle[COLOR=#66cc66]([/COLOR]STD_OUTPUT_HANDLE[COLOR=#66cc66])[/COLOR],
                         FOREGROUND_INTENSITY | FOREGROUND_RED[COLOR=#66cc66])[/COLOR];
    [COLOR=#000000][B]break[/B][/COLOR];
  [COLOR=#b1b100]case[/COLOR] [COLOR=#cc66cc]2[/COLOR]:    [COLOR=#808080][I]// Verde sobre Preto[/I][/COLOR]
    SetConsoleTextAttribute[COLOR=#66cc66]([/COLOR]GetStdHandle[COLOR=#66cc66]([/COLOR]STD_OUTPUT_HANDLE[COLOR=#66cc66])[/COLOR],
                      FOREGROUND_INTENSITY | FOREGROUND_GREEN[COLOR=#66cc66])[/COLOR];
    [COLOR=#000000][B]break[/B][/COLOR];
  [COLOR=#b1b100]case[/COLOR] [COLOR=#cc66cc]3[/COLOR]:    [COLOR=#808080][I]// Amarelo sobre Preto[/I][/COLOR]
    SetConsoleTextAttribute[COLOR=#66cc66]([/COLOR]GetStdHandle[COLOR=#66cc66]([/COLOR]STD_OUTPUT_HANDLE[COLOR=#66cc66])[/COLOR],
                      FOREGROUND_INTENSITY | FOREGROUND_RED |
                      FOREGROUND_GREEN[COLOR=#66cc66])[/COLOR];
    [COLOR=#000000][B]break[/B][/COLOR];
  [COLOR=#b1b100]case[/COLOR] [COLOR=#cc66cc]4[/COLOR]:    [COLOR=#808080][I]// Azul sobre Preto[/I][/COLOR]
    SetConsoleTextAttribute[COLOR=#66cc66]([/COLOR]GetStdHandle[COLOR=#66cc66]([/COLOR]STD_OUTPUT_HANDLE[COLOR=#66cc66])[/COLOR],
                      FOREGROUND_INTENSITY | FOREGROUND_BLUE[COLOR=#66cc66])[/COLOR];
    [COLOR=#000000][B]break[/B][/COLOR];
  [COLOR=#b1b100]case[/COLOR] [COLOR=#cc66cc]5[/COLOR]:    [COLOR=#808080][I]// Magenta sobre Preto[/I][/COLOR]
    SetConsoleTextAttribute[COLOR=#66cc66]([/COLOR]GetStdHandle[COLOR=#66cc66]([/COLOR]STD_OUTPUT_HANDLE[COLOR=#66cc66])[/COLOR],
                     FOREGROUND_INTENSITY | FOREGROUND_RED |
                     FOREGROUND_BLUE[COLOR=#66cc66])[/COLOR];
    [COLOR=#000000][B]break[/B][/COLOR];
  [COLOR=#b1b100]case[/COLOR] [COLOR=#cc66cc]6[/COLOR]:    [COLOR=#808080][I]// Cyan sobre Preto[/I][/COLOR]
    SetConsoleTextAttribute[COLOR=#66cc66]([/COLOR]GetStdHandle[COLOR=#66cc66]([/COLOR]STD_OUTPUT_HANDLE[COLOR=#66cc66])[/COLOR],
                    FOREGROUND_INTENSITY | FOREGROUND_GREEN |
                    FOREGROUND_BLUE[COLOR=#66cc66])[/COLOR];
    [COLOR=#000000][B]break[/B][/COLOR];
  [COLOR=#b1b100]case[/COLOR] [COLOR=#cc66cc]7[/COLOR]:    [COLOR=#808080][I]// Preto sobre Cinza[/I][/COLOR]
    SetConsoleTextAttribute[COLOR=#66cc66]([/COLOR]GetStdHandle[COLOR=#66cc66]([/COLOR]STD_OUTPUT_HANDLE[COLOR=#66cc66])[/COLOR],
                  BACKGROUND_INTENSITY | BACKGROUND_INTENSITY[COLOR=#66cc66])[/COLOR];
    [COLOR=#000000][B]break[/B][/COLOR];
  [COLOR=#b1b100]case[/COLOR] [COLOR=#cc66cc]8[/COLOR]:    [COLOR=#808080][I]// Preto sobre Branco[/I][/COLOR]
    SetConsoleTextAttribute[COLOR=#66cc66]([/COLOR]GetStdHandle[COLOR=#66cc66]([/COLOR]STD_OUTPUT_HANDLE[COLOR=#66cc66])[/COLOR],
                  BACKGROUND_INTENSITY | FOREGROUND_INTENSITY |
                  BACKGROUND_RED | BACKGROUND_GREEN |
                  BACKGROUND_BLUE[COLOR=#66cc66])[/COLOR];
    [COLOR=#000000][B]break[/B][/COLOR];
  [COLOR=#b1b100]case[/COLOR] [COLOR=#cc66cc]9[/COLOR]:    [COLOR=#808080][I]// Vermelho sobre Branco[/I][/COLOR]
    SetConsoleTextAttribute[COLOR=#66cc66]([/COLOR]GetStdHandle[COLOR=#66cc66]([/COLOR]STD_OUTPUT_HANDLE[COLOR=#66cc66])[/COLOR],
                  BACKGROUND_INTENSITY | FOREGROUND_INTENSITY |
                  BACKGROUND_RED | BACKGROUND_GREEN |
                  BACKGROUND_BLUE |
      FOREGROUND_RED[COLOR=#66cc66])[/COLOR];
    [COLOR=#000000][B]break[/B][/COLOR];
  [COLOR=#b1b100]case[/COLOR] [COLOR=#cc66cc]10[/COLOR]:    [COLOR=#808080][I]// Verde sobre Branco[/I][/COLOR]
    SetConsoleTextAttribute[COLOR=#66cc66]([/COLOR]GetStdHandle[COLOR=#66cc66]([/COLOR]STD_OUTPUT_HANDLE[COLOR=#66cc66])[/COLOR],
                 BACKGROUND_INTENSITY | FOREGROUND_INTENSITY |
                 BACKGROUND_RED | BACKGROUND_GREEN |
                 BACKGROUND_BLUE | FOREGROUND_GREEN[COLOR=#66cc66])[/COLOR];
    [COLOR=#000000][B]break[/B][/COLOR];
  [COLOR=#b1b100]case[/COLOR] [COLOR=#cc66cc]11[/COLOR]:    [COLOR=#808080][I]// Amarelo sobre Branco[/I][/COLOR]
    SetConsoleTextAttribute[COLOR=#66cc66]([/COLOR]GetStdHandle[COLOR=#66cc66]([/COLOR]STD_OUTPUT_HANDLE[COLOR=#66cc66])[/COLOR],
                 BACKGROUND_INTENSITY | FOREGROUND_INTENSITY |
                 BACKGROUND_RED | BACKGROUND_GREEN |
                 BACKGROUND_BLUE | FOREGROUND_RED |
                 FOREGROUND_GREEN[COLOR=#66cc66])[/COLOR];
    [COLOR=#000000][B]break[/B][/COLOR];
  [COLOR=#b1b100]case[/COLOR] [COLOR=#cc66cc]12[/COLOR]:    [COLOR=#808080][I]// Azul sobre Branco[/I][/COLOR]
    SetConsoleTextAttribute[COLOR=#66cc66]([/COLOR]GetStdHandle[COLOR=#66cc66]([/COLOR]STD_OUTPUT_HANDLE[COLOR=#66cc66])[/COLOR],
                 BACKGROUND_INTENSITY | FOREGROUND_INTENSITY |
                 BACKGROUND_RED | BACKGROUND_GREEN |
                 BACKGROUND_BLUE | FOREGROUND_BLUE[COLOR=#66cc66])[/COLOR];
    [COLOR=#000000][B]break[/B][/COLOR];
  [COLOR=#b1b100]case[/COLOR] [COLOR=#cc66cc]13[/COLOR]:    [COLOR=#808080][I]// Magenta sobre Branco[/I][/COLOR]
    SetConsoleTextAttribute[COLOR=#66cc66]([/COLOR]GetStdHandle[COLOR=#66cc66]([/COLOR]STD_OUTPUT_HANDLE[COLOR=#66cc66])[/COLOR],
                 BACKGROUND_INTENSITY | FOREGROUND_INTENSITY |
                 BACKGROUND_RED | BACKGROUND_GREEN |
                 BACKGROUND_BLUE | FOREGROUND_RED |
                 FOREGROUND_BLUE[COLOR=#66cc66])[/COLOR];
    [COLOR=#000000][B]break[/B][/COLOR];
  [COLOR=#b1b100]case[/COLOR] [COLOR=#cc66cc]14[/COLOR]:    [COLOR=#808080][I]// Cyan sobre Branco[/I][/COLOR]
    SetConsoleTextAttribute[COLOR=#66cc66]([/COLOR]GetStdHandle[COLOR=#66cc66]([/COLOR]STD_OUTPUT_HANDLE[COLOR=#66cc66])[/COLOR],
                 BACKGROUND_INTENSITY | FOREGROUND_INTENSITY |
                 BACKGROUND_RED | BACKGROUND_GREEN |
                 BACKGROUND_BLUE | FOREGROUND_GREEN |
                 FOREGROUND_BLUE[COLOR=#66cc66])[/COLOR];
    [COLOR=#000000][B]break[/B][/COLOR];
  [COLOR=#b1b100]case[/COLOR] [COLOR=#cc66cc]15[/COLOR]:    [COLOR=#808080][I]// Branco sobre Branco[/I][/COLOR]
    SetConsoleTextAttribute[COLOR=#66cc66]([/COLOR]GetStdHandle[COLOR=#66cc66]([/COLOR]STD_OUTPUT_HANDLE[COLOR=#66cc66])[/COLOR],
                BACKGROUND_INTENSITY | FOREGROUND_INTENSITY |
                BACKGROUND_RED | BACKGROUND_GREEN |
                BACKGROUND_BLUE | FOREGROUND_RED |
                FOREGROUND_GREEN | FOREGROUND_BLUE[COLOR=#66cc66])[/COLOR];
    [COLOR=#000000][B]break[/B][/COLOR];
  [COLOR=#b1b100]default[/COLOR] :    [COLOR=#808080][I]// Branco sobre Preto[/I][/COLOR]
    SetConsoleTextAttribute[COLOR=#66cc66]([/COLOR]GetStdHandle[COLOR=#66cc66]([/COLOR]STD_OUTPUT_HANDLE[COLOR=#66cc66])[/COLOR],
                FOREGROUND_INTENSITY | FOREGROUND_RED |
                FOREGROUND_GREEN | FOREGROUND_BLUE[COLOR=#66cc66])[/COLOR];
    [COLOR=#000000][B]break[/B][/COLOR];
  [COLOR=#66cc66]}[/COLOR]
[COLOR=#66cc66]}[/COLOR]
[COLOR=#993333]int[/COLOR] main[COLOR=#66cc66]([/COLOR][COLOR=#66cc66])[/COLOR]
[COLOR=#66cc66]{[/COLOR]
setrgb[COLOR=#66cc66]([/COLOR][COLOR=#cc66cc]1[/COLOR][COLOR=#66cc66])[/COLOR];
[URL="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"][COLOR=#000066]printf[/COLOR][/URL][COLOR=#66cc66]([/COLOR][COLOR=#ff0000]"Cores[COLOR=#000099][B]\n[/B][/COLOR]"[/COLOR][COLOR=#66cc66])[/COLOR];
getch[COLOR=#66cc66]([/COLOR][COLOR=#66cc66])[/COLOR];
setrgb[COLOR=#66cc66]([/COLOR][COLOR=#cc66cc]0[/COLOR][COLOR=#66cc66])[/COLOR];
[URL="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"][COLOR=#000066]printf[/COLOR][/URL][COLOR=#66cc66]([/COLOR][COLOR=#ff0000]"Cores[COLOR=#000099][B]\n[/B][/COLOR]"[/COLOR][COLOR=#66cc66])[/COLOR];
getch[COLOR=#66cc66]([/COLOR][COLOR=#66cc66])[/COLOR];
 
[COLOR=#66cc66]}
[/COLOR]


(Não sei se estou a ir contra alguma regra)
 
Última edição:
Código:
#include "windows.h"

visual studio 2005\projects\hotel manager 2008\hotel manager 2008\color.c(4) : fatal error C1083: Cannot open include file: 'windows.h': No such file or directory

Onde está esse ficheiro?
 
Based on the output there I'm gona assume your using Visual Studio 2005?

If so you are probbly missing a include path.

Try doint the following:
  1. Go to Tools->Option
  2. From there select "Projects and Solutions" and click the "VC++ Directories"
  3. Select "Include files" from the top right dropdown box.
  4. In that list should be this line "$(VCInstallDir)PlatformSDK\Include"
  5. If it is not, add it and you should be good to go.
The windows.h file is in the "\VC\PlatformSDK\Include" folder in your Visual Studio install directory.

Essa linha eu tenho na lista.. :S

Resta-me apenas:

If you're using the Express edition, then you have to install a platform
SDK, in which you'll find "windows.h".

Onde arranjar essa platform SDK po VSC++2005 Express Edition ??
 
Back
Topo