web-dev-qa-db-fra.com

Déclarer des tableaux en langage c sans taille initiale

Écrivez un programme pour manipuler les détails de la température comme indiqué ci-dessous.
- Saisissez le nombre de jours à calculer. - Fonction principale
- Température d'entrée en degrés Celsius - fonction d'entrée
- Convertir la température de Celsius en Fahrenheit - Fonction séparée
- trouver la température moyenne en Fahrenheit.

comment puis-je faire ce programme sans taille initiale de tableau ??

#include<stdio.h>
#include<conio.h>
void input(int);
int temp[10];
int d;
void main()
{
    int x=0;
    float avg=0,t=0;
    printf("\nHow many days : ");
    scanf("%d",&d);
    input(d);
    conv();
    for(x=0;x<d;x++)
    {
        t=t+temp[x];
    }
    avg=t/d;
    printf("Avarage is %f",avg);
    getch();
}
void input(int d)
{
    int x=0;
    for(x=0;x<d;x++)
    {
        printf("Input temperature in Celsius for #%d day",x+1);
        scanf("%d",&temp[x]);
    }
}
void conv()
{
    int x=0;
    for(x=0;x<d;x++)
    {
        temp[x]=1.8*temp[x]+32;
    }
}
14
ViSTA

En C, les tableaux et les pointeurs sont étroitement liés. En fait, par conception, un tableau n'est qu'une convention de syntaxe pour accéder à un pointeur vers une mémoire allouée.

Donc, en C, la déclaration

 anyarray[n] 

est le même que

 *(anyarray+n)

Utilisation de l'arithmétique des pointeurs.

Vous n'avez pas vraiment à vous soucier des détails pour le faire "fonctionner" car il est conçu pour être quelque peu intuitif.

Créez simplement un pointeur, allouez la mémoire, puis accédez-y comme un tableau.

Voici quelques exemples -

int *temp = null; // this will be our array


// allocate space for 10 items
temp = malloc(sizeof(int)*10);


// reference the first element of temp
temp[0] = 70;


// free the memory when done
free(temp);

N'oubliez pas - si vous accédez en dehors de la zone allouée, vous aurez des effets inconnus.

25
Hogan

Un tableau sans taille initiale est simplement un pointeur. Afin de définir dynamiquement la taille du tableau, vous devez utiliser les fonctions malloc() ou calloc(). Ceux-ci alloueront une quantité spécifiée d'octets de mémoire.

Dans votre code ci-dessus, déclarez temp comme un int pointeur

int *temp;

Ensuite, allouez-lui de l'espace en utilisant malloc() ou calloc(). L'argument que ces fonctions prennent est le nombre de octets de mémoire à allouer. Dans ce cas, vous voulez suffisamment d'espace pour d ints. Donc...

temp = malloc(d * sizeof(int));

malloc renvoie un pointeur sur le premier octet du bloc de mémoire qui vient d'être alloué. Les tableaux réguliers sont simplement des pointeurs vers le premier octet d'un bloc de mémoire sectionné, ce qui est exactement ce que temp est maintenant. Ainsi, vous pouvez traiter le pointeur temp comme un tableau! Ainsi:

temp[1] = 10;
int foo = temp[1];
printf("%d", foo);

Les sorties

10
5
btidwell

Vous devrez déclarer temp comme un pointeur int (au lieu d'un tableau int). Ensuite, vous pouvez utiliser malloc dans votre main (après votre premier scanf):

temp = malloc(d * sizeof(int));
2
Drew McGowen

Si votre compilateur prend en charge c99, Utilisez simplement VLA (tableau de longueur variable). Utilisez comme ceci:

void input(int);

 int d;
 void main()
 {
    int x=0;
    float avg=0,t=0;
    printf("\nHow many days : ");
    scanf("%d",&d);
    int temp[d];
    input(d);
    conv();
    for(x=0;x<d;x++)
    {
       t=t+temp[x];
    }
    avg=t/d;
    printf("Avarage is %f",avg);
    getch();
  }

temp[] Est maintenant défini dans main() après la saisie de la date.

1
haccks

1-ajoutez #include<stdlib.h> En haut de votre fichier. Modifiez ensuite le code conv () comme suit:
2- modifier la déclaration de temp comme suit (variable globale):

int *temp;

3- Modifiez la fonction input(int d) comme suit (testé sur Visual Studio 2010):

  void input(int d)
    {
        int x=0;
        temp=(int*)malloc(sizeof(int)*d);
        for(x=0;x<d;x++)
        {
            printf("Input temperature in Celsius for #%d day",x+1);
            scanf("%d",&temp[x]);
        }
    }
1
codezombie

Je n'ai rien changé d'autre, vous pouvez donc le voir clairement.

#include<stdio.h>
#include<conio.h>
#include <stdlib.h>   //here
void input(int);
int *temp=0;  //here
int d;
void main()
{
    int x=0;
    float avg=0,t=0;
    printf("\nHow many days : ");
    scanf("%d",&d);
    temp=malloc(d * sizeof(int));  //here
    input(d);
    conv();
    for(x=0;x<d;x++)
    {
        t=t+temp[x];
    }
    avg=t/d;
    printf("Avarage is %f",avg);
    getch();
}
void input(int d)
{
    int x=0;
    for(x=0;x<d;x++)
    {
        printf("Input temperature in Celsius for #%d day",x+1);
        scanf("%d",&temp[x]);
    }
}
void conv()
{
    int x=0;
    for(x=0;x<d;x++)
    {
        temp[x]=1.8*temp[x]+32;
    }
}
0
Immueggpain

Allouez le "tableau" dynamiquement sur le tas après avoir lu la taille.

0