Newsgroup: it.comp.lang.c
Titolo: strutture e array

ciao a tutti, ho scritto questo programma che, letto un array da un
file, lo divide in sottoarray in corrispondenza di elementi
consecutivi uguali nella prima colonna. ad esempio, se l'array è
box[1]:
1 2
2 3
2 4
il programma lo divide in box[2]:
1 2
2 3
e box[3]:
2 4
per fare ciò ho utilizzato la struttura box[num] con num intero che
conta i sottoarray creati.
Fin qui ok. Adesso vorrei applicare ad ogni struttura sottoarray delle
funzioni di interpolazione, e per fare ciò devo associare ogni
elemento della struttura ad un vettore colonna: ad esempio il vettore
x[2][0]=[1,2] si associa a un vettore generico z[i]=[1,2] e il vettore
colonna x[2][1]=[2,3] a t[i]=[2,3].
Questo perchè la funzione interpolatrice vuole come argomenti z[i] e
t[i].
Ho provato scrivendo
box[num].x[i][0]=z[i]   e  box[num].x[i][j]=t[i] ma non funziona
nulla... e sono bloccato, non riesco ad andare avanti...mi date un
aiuto???
grazie a tutti
f.
Programma:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void initarray();
void stampa(int);
#define maxbox 500
typedef struct {
  float x[2][2];
  int max_val;
}
boxtype;
boxtype box[maxbox];
int x = 2;
int y = 2;
int salta=0;
int max_val=0;
/*
  Funzione che copia/splitta dall'array principale A1 agli array
derivati A2 e A3 fino ad An~ se trova elementi consecutivi uguali
nella prima colonna.*/
void sottoarray(){
  int j;
  int i;
  int beccato=0;
  int sottrai=0;
  for(i=0;i<x;i++){
    for(j=0;j<y;j++){
      box[2+salta].x[i-sottrai][j] = box[1].x[i][j];
      if(i < (x-1) && box[1].x[i][0] == box[1].x[i+1]
[0])beccato=1;
    }
    max_val++;
    box[2+salta].max_val++;
    if(beccato==1)salta++,box[2+salta].max_val= 0,sottrai=max_val;
    beccato=0;
  }
}
int main (){
  initarray();
  printf("\n");
  sottoarray();
  int i;
  for(i=2;i<=2+salta;i++)stampa(i);
  printf("\n");
  return 0;
}
void initarray()
{
  int ciclo =0;
  int j;
  int i;
FILE *fp;
 fp=fopen("file.txt", "r");
 if(!fp)
   {
     printf("errore nell'apertura del file \n");
     exit (1);
   }
 for(i=0;i<x;i++)
   {
     for(j=0;j<y;j++){
       fscanf(fp, "%f\n", &box[1].x[i][j]);
     }
   }
 fclose(fp);
 for(i=0;i<x;i++)
   {
     printf("\n");
     for(j=0;j<y;j++){
       printf("%f|" ,box[1].x[i][j]);
     }
   }
}
// stampa  array Derivati Da A2 fino ad An~
void stampa(int num){
  int j;
  int i;
  printf("\n ");
  for(i=0;i<box[num].max_val;i++){
    printf("\n ");
    printf("Y:%d |" ,i);
    for(j=0;j<y;j++){
      printf("%f|" , box[num].x[i][j]);
    }
  }
}

 t[i].
x[2][0] non č un vettore, ed č pure fuori range. Devi chiarire 
meglio il problema perché cosě non si riesce a capire.
Ciao.

 Ciao.
Scua, hai ragione: allora cerco di spiegarmi meglio.
Ad es., dato un sottoarray (struttura)
1 2
3 4
voglio che il programma assegni al vettore colonna( appartenente alla
struttura) di elementi 1 3 il nome x[i] e alla colonna 2 4 il nome
y[i], cioè voglio che il programma legga separatamente i vettori
colonna della struttura, perchè essi (x[i] e y[i]) sono gli argomenti
da passare alla funzione che interpola in ogni sottoarray creato.
Spero di essere stato più chiaro ora.
grazie mille
f.

 grazie mille!
Ci sono diverse possibilità, eccone alcune:
1. puoi modificare la funzione in modo che accetti la matrice;
2. puoi trasporre la matrice 2x2 e passare alla funzione le 2 
righe (originariamente colonne):
3. Hai la matrice 2x2, copia gli elementi che ti servono in 
due vettori;
4. potresti modificare la struttura boxtype in modo da 
sostituire alla matrice 2x2, 2 vettori di 2 elementi e 
modificare l'algoritmo di suddivisione della matrice 
originaria in modo che ciascuno dei 2 vettori rappresenti una 
colonna.
Ciao.

 colonna.
??? :(
ciao.

 box[num].x[i][0]=z[i]   e  box[num].x[i][j]=t[i] ma non funziona...
Ci credo che non funziona... mica puoi fare gli assegnamenti 
fra vettori e poi al massimo così come intendi li fai al 
contrario.
z[0]=box[num].x[0][0];
z[1]=box[num].x[1][0];
t[0]=box[num].x[0][1];
t[1]=box[num].x[1][1];
E poi passi alla funzione z e t. Comunque la trasposizione 
della matrice e il passaggio delle righe è più immediato e non 
hai da lavorare con 2 vettori in più.
Ciao.