Ir ao conteúdo

estruturas e vectores


Cambalinho

Posts recomendados

Postado

imagina esta estrutura:

struct Person
{
int a[10];
bool b;
};

imgina que em vez do 10 é 1 numero que quero meter em codigo. como o faço?

penso que tenho de usar static, mas alguem me pode explicar-me isso?

Postado

Pra fazer isso, usando o padrão C ANSI, apenas com alocação dinâmica.

Uma coisa é você definir tamanhos dentro do código. Esse contexto será criado pelo compilador, deixando o programa apto a trabalhar com ele. Outra coisa é, fornecer os dados após a compilação.

Se você quer informar um valor após o programa já existir (compilado), ele não saberá como tratar uma variável estática. Isso ocorre porque, o compilador pré-define o espaço quando informado o tamanho em momento de compilação, pois fará parte do conteúdo binário criado (.exe).

Após esse processo, o programa desconhece qualquer modificação desse tipo, permitindo apenas alocação dinâmica.

Talvez existam compiladores que contornem isso, mas, não é um processo comum e também, não deixaria de fazer uma alocação dinâmica, porém, mostrando ao usuário como se fosse estático, pois ele não mudará o arquivo binário (.exe).

Se eu estiver enganado, por favor, me corrijam. :)

Postado

Você pode usar um ponteiro e alocar o tamanho.


typedef struct Person{
int *a;
int b;
}PERSON;

int main(void){
PERSON p;

p.a = (int*)malloc(sizeof(int) * 3);

p.a[0] = 1;
p.a[1] = 2;
p.a[2] = 3;

Postado

eu consegui de outra forma(eu ainda n aprendi memoria;)):

#include <stdio.h>


struct person
{
static int b[5];
char c;
};

int main()
{
static b[11]={1,2,3,4,5,6,7,8,9,20,45};
printf("%d\n",b[10]);
return 0;
}

é mais simples e funciona;)

obrigado aos 2

Postado
Não deu erro de compilação?

E uma varíavel declarada numa estrutura não tem nenhuma relação com outra externa de mesmo nome.

desculpa.. tens razao. eu enganei-me lol

#include <stdio.h>


struct person
{
static int b[5];
char c;
};

int main()
{
person a;
a.b[11]={1,2,3,4,5,6,7,8,9,20,45};
printf("%d\n",b[10]);
return 0;
}

mas ja percebes que queria fazer. mas este codigo tem erro. eu sabia de 1 forma para resolver isto. vamos ver se ainda a acho

eu pensei ter visto outro codigo, mas o teu funciona:

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

struct person
{
int *a;
char c;
};

int main()
{
person a;
int i;
a.a = (int*)malloc(sizeof(int) * 10);
for (i=0; i<10;i++)
{
a.a[i] =i;
}
printf("%d\n",a.a[9]);
return 0;
}

em que o '10' corresponte á quantidade de indices(0-9).

muito obrigado

Postado
É só fazer alocação dinâmica.


person *p = (person*)malloc(sizeof(person) * 4);

desculpa, mas da-me erro:

"--------------------Configuration: Sprite2 - Win32 Debug--------------------

Compiling...

Test Sprite2.cpp

c:\users\joaquim\documents\visual c 98\sprite2\test sprite2.cpp(23) : error C2440: 'type cast' : cannot convert from 'void *' to 'struct Images'

No constructor could take the source type, or constructor overload resolution was ambiguous

Error executing cl.exe.

Sprite2.exe - 1 error(s), 0 warning(s)"

vê o codigo que estou a usar:

struct Images
{
HBITMAP ImageImage;
BITMAP Imagebm;
HDC ImagehdcMem;
HBITMAP ImageMaskImage;
BITMAP ImageMaskbm;
HDC ImageMaskhdcMem;
};

//esta class é 1 sub class
class subimages
{
public: int ActualSubimage;
public: int TotalSubimages;
public: struct Images *SubImages;
..........................


//eis como faço:
sprite2 a,b,c;
a.Visible =true;
a.Direction=Left;
a.Images.Image1.Stop.SubImages=(struct Images) malloc(sizeof(struct Images) * 1);
a.Images.Image1.Stop.ActualSubimage=0;
a.Images.Image1.Stop.TotalSubimages=1;
a.Images.Image1.Stop.Load("C:\\Users\\Joaquim\\Documents\\Visual C 98\\Sprite2\\Debug\\test1.bmp");
SetRect(&a.Position,x,y,a.Images.Image1.Stop.SubImages[0].Imagebm.bmWidth,a.Images.Image1.Stop.SubImages[0].Imagebm.bmHeight);

(neste caso em particular é mesmo '1' elemento que preciso... pois é em fase de testes;))

ves alguma coisa mal com o malloc()?

Postado
No post #7, já está definindo um vetor estático para o tipo de estrutura, portanto, não é possível modificar seu tamanho.

Para que isso funcione, retire o "[10]".

e meti como ponteiro.. mas continuo sempre com erros:(

estou a ficar desanimado:(

será que me esta a faltar algo?

(eu posso partilhar o ficheiro fonte e o sprite2.h)

Postado

ja percebi como se faz para arrays normais mas para arrays multidimensionais?

como se faz?

char *Frases;

como se faz para meter com 2 ou mais dimensoes usando a funçao malloc()?

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

int main()
{
char **nomes = (char**)malloc(10 * sizeof(char*));

nomes[0] = "Matheus";
nomes[1] = "Pedro";

nomes[2] = (char*)malloc(3 * sizeof(char));
nomes[2][0] = 'J';
nomes[2][1] = 'u';
nomes[2][2] = '\0';

puts(nomes[0]);
puts(nomes[1]);
puts(nomes[2]);

getchar();
return 0;
}

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

int main()
{
char **nomes = (char**)malloc(10 * sizeof(char*));

nomes[0] = "Matheus";
nomes[1] = "Pedro";

nomes[2] = (char*)malloc(3 * sizeof(char));
nomes[2][0] = 'J';
nomes[2][1] = 'u';
nomes[2][2] = '\0';

puts(nomes[0]);
puts(nomes[1]);
puts(nomes[2]);

getchar();
return 0;
}

muito obrigado;)

desculpa, mas qual é a diferença entre malloc(), realloc() e calloc()(o manual: Linguagem C, nao me explica bem a diferença)?

Postado
"malloc()": Aloca novo espaço em memória.

"realloc()": Realoca um espaço, pra mais ou pra menos, mantendo o conteúdo existente na memória, ou, perdendo o excedente, caso o tamanho alocado reduza.

"calloc()": Mesma coisa que malloc, porém, inicializa o espaço com 0's (zeros), na quantidade que você informar.

muito obrigado amigo

  • 4 semanas depois...
  • Moderador
Postado

Caso o autor do tópico necessite, o mesmo será reaberto, para isso deverá entrar em contato com a moderação solicitando o desbloqueio.

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!