andreb Posted May 23, 2008 at 11:08 PM Report Share #187013 Posted May 23, 2008 at 11:08 PM Boas, eu decidi encerrar o meu projecto de FTP e de Sockets e aprender mais um pouco sobre classes... estou a criar uma class para depois poder criar programas com varias línguas.. mas o pouco código que tenho está cheio de erros e não sei como corrigilos... estou aqui a meia hora mudar const char's para char's, char's para const char's e não acerto com isto.. será que alguém me pode ajudar a corrigir o código? CODIGO: #include <iostream> #include <cstdio> #include <cstdlib> using namespace std; namespace AB{ class Lang { int x; const char* lang_pt[0x100]="array"; const char* lang_en[0x100]="array"; const char* lang_default="pt"; public: void setdefault(const char* lang){ lang_default=lang; } void set(int a,const char* string,const char* lang){ if(lang==NULL){ lang=lang_default; } switch(lang){ case "pt": lang_pt[a]=string; break; case "en": lang_en[a]=string; break; } }; }; Lang Lang; } ERROS com o VS C++ 2008: (9) : error C2864: 'AB::Lang::lang_pt' : only static const integral data members can be initialized within a class (10) : error C2864: 'AB::Lang::lang_en' : only static const integral data members can be initialized within a class (11) : error C2864: 'AB::Lang::lang_default' : only static const integral data members can be initialized within a class (20) : error C2450: switch expression of type 'const char *' is illegal (21) : error C2051: case expression not constant (22) : error C2051: case expression not constant (23) : warning C4060: switch statement contains no 'case' or 'default' labels Cumps andreb. ... Link to comment Share on other sites More sharing options...
Baderous Posted May 23, 2008 at 11:13 PM Report Share #187015 Posted May 23, 2008 at 11:13 PM Penso que tens de definir as variáveis lang_pt, lang_en e lang_default como static. Link to comment Share on other sites More sharing options...
andreb Posted May 23, 2008 at 11:18 PM Author Report Share #187021 Posted May 23, 2008 at 11:18 PM Já tinha experimentado por static e mesmo assim continua a dar erro. Quanto ao switch penso que depois de conseguir resolver essas acima dá para resolve-lo. ... Link to comment Share on other sites More sharing options...
TheDark Posted May 24, 2008 at 03:29 AM Report Share #187065 Posted May 24, 2008 at 03:29 AM Ora aqui está algo de C++ sobre o qual nunca tinha pensado: campos const. Nada que o meu amigo Google não pudesse resolver 🙂 Como está descrito nos erros, o único tipo de variáveis que podes inicializar na declaração de uma classe são tipos inteiros (int, short int, char, etc) estáticos e constantes. O que estás a tentar afectar são arrays de apontadores para char, e aí tens outro problema: estás a tentar afectá-los com arrays de char. Quando muito, poderias fazer const char lang_en[0x100]="array";, ou ainda const char* lang_en="array";, o que também não iria funcionar porque são arrays de um tipo inteiro, e não um tipo inteiro. A única maneira de inicializares membros const de uma classe é na lista de inicialização do construtor da classe, e aqui aqui cria-se outro problema com a inicialização de arrays: não podem ser inicializados em listas de inicialização. A única solução que te resta é teres apontadores para char, e inicializá-los na lista de inicialização da seguinte forma: const char *lang_pt; const char *lang_en; char *lang_default; (...) Lang(): lang_pt("array"), lang_en("array"), lang_pt("pt") {} Quanto ao switch... não podes utilizar uma string como expressão, isso é à C# 😄 Tens que utilizar ifs com strcmp. Desaparecido. Link to comment Share on other sites More sharing options...
andreb Posted May 24, 2008 at 10:55 AM Author Report Share #187091 Posted May 24, 2008 at 10:55 AM Obg já esta tudo a funcionar menos o sprintf(lang_pt[a],"%s",string); que foi agora substitui o lang_pt[a]=string; que dava este erro penso por estar a tentar modificar consts mas agora com esse sprintf já não da o mesmo erro porque diz error C2664: 'sprintf' : cannot convert parameter 1 from 'const char' to 'char *', mas as variáveis estão as duas declaradas como: const char*.isto tudo surgio por causa disto, em que eu o usei num programazinho meu em C e deu o seguinte resultado: //Ficheiro formatado por STRING_CATCHER V 1.0 //By: www.FABIOFASANTOS.tk //Em: Sabado 24 de Maio de 2008 ---- 11:49:44 //Ficheiro original: main.c const char* STRING_CATCHER[21] = { "links.txt", "r", "links.txt", "w", "links.txt", "r", "COLOR F", "links.txt", "r", "\nEscolha: ", "%d", "start %s", "start %s", "start %s", "start %s", "start %s", "start %s", "start %s", "start %s", "start %s", "start %s" }; #include <stdio.h> #include <stdlib.h> int main() { FILE * fptest; fptest=fopen(STRING_CATCHER[0],STRING_CATCHER[1]); if(fptest==NULL){ fptest=fopen(STRING_CATCHER[2],TRING_CATCHER[3]); } int escolha; char l1[1000]; char l2[1000]; char l3[1000]; char l4[1000]; char l5[1000]; char l6[1000]; char l7[1000]; char l8[1000]; char l9[1000]; char l10[1000]; char l11[1000]; char l12[1000]; char l13[1000]; char l14[1000]; char l15[1000]; char l16[1000]; char l17[1000]; char l18[1000]; char l19[1000]; char l20[1000]; char str[1000]; FILE *fp; fp=fopen(STRING_CATCHER[4],STRING_CATCHER[5]); int ch, lines=0; while((ch = fgetc(fp)) != EOF ) { if ( ch == '\n' ) { ++lines; } } lines=lines+1; fclose(fp); if(lines>1){ system(STRING_CATCHER[6]); fp=fopen(STRING_CATCHER[7],/STRING_CATCHER[8]); fgets(l1,1000,fp); fgets(l2,1000,fp); printf(l1); } if(lines>3){ fgets(l3,1000,fp); fgets(l4,1000,fp); printf(l3); } if(lines>5){ fgets(l5,1000,fp); fgets(l6,1000,fp); printf(l5); } if(lines>7){ fgets(l7,1000,fp); fgets(l8,1000,fp); printf(l7); } if(lines>9){ fgets(l9,1000,fp); fgets(l10,1000,fp); printf(l9); } if(lines>11){ fgets(l11,1000,fp); fgets(l12,1000,fp); printf(l11); } if(lines>13){ fgets(l13,1000,fp); fgets(l14,1000,fp); printf(l13); } if(lines>15){ fgets(l15,1000,fp); fgets(l16,1000,fp); printf(l15); } if(lines>17){ fgets(l17,1000,fp); fgets(l18,1000,fp); printf(l17); } if(lines>19){ fgets(l19,1000,fp); fgets(l20,1000,fp); printf(l19); } printf(STRING_CATCHER[9]); scanf(TRING_CATCHER[10],&escolha); switch(escolha) { case 1: sprintf(str,STRING_CATCHER[11],l2); break; case 2: sprintf(str,STRING_CATCHER[12],l4); break; case 3: sprintf(str,STRING_CATCHER[13],l6); break; case 4: sprintf(str,STRING_CATCHER[14],l8); break; case 5: sprintf(str,STRING_CATCHER[15],l10); break; case 6: sprintf(str,STRING_CATCHER[16],l12); break; case 7: sprintf(str,STRING_CATCHER[17],l14); break; case 8: sprintf(str,STRING_CATCHER[18],l16); break; case 9: sprintf(str,STRING_CATCHER[19],l18); break; case 10: sprintf(str,STRING_CATCHER[20],l20); break; } system(str); return 0; } e eu queria criar uma coisa parecida com aquela sena do STRING_CATCHER[21] para poder ter em varias línguas o programa. não sei se já me tinha feito entender.. ... Link to comment Share on other sites More sharing options...
TheDark Posted May 24, 2008 at 03:44 PM Report Share #187171 Posted May 24, 2008 at 03:44 PM Tens que utilizar sprintf(lang_pt, "%s", string); porque lang_pt[0] traduz-se no 1º caracter da string. E tens que ter a certeza que tens espaço suficiente alocado em lang_pt antes de utilizar o sprintf. Já agora, porque não utilizas o strcpy em vez do sprintf? Com essa formatação, fazia mais sentido. Desaparecido. Link to comment Share on other sites More sharing options...
andreb Posted May 24, 2008 at 04:53 PM Author Report Share #187190 Posted May 24, 2008 at 04:53 PM mas assim não vai dar para por apenas uma frase em lang_pt??? tipo eu queria como o string catcher em que STRING_CATCHER[19] por exemplo se traduz numa string... ... Link to comment Share on other sites More sharing options...
TheDark Posted May 24, 2008 at 05:04 PM Report Share #187196 Posted May 24, 2008 at 05:04 PM Então a tua declaração inicial de char* lang_pt[0x100] estava correcta. Tens é que tirar o const, ou arranjar uma maneira (que eu não conheço, nem sei se é possível) de inicializar os arrays. De qualquer maneira, não podes inicializá-los como fizeste no 1º post, porque "array" é um array de chars, e não um array de apontadores para char. Desaparecido. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now