|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Dec 2003
Città: Hamburg/Torino
Messaggi: 2757
|
[C] Come passare array a funzioni
Nell'header ho
Codice:
typedef struct mossa_t
{
int numero_mossa;
char coordinataBianco[COORD + 1];
char coordinataNero[COORD + 1];
}mossa;
typedef struct partita_t
{
char *luogo;
long int fixed_data;
char *giocatoreBianco;
char *giocatoreNero;
int numeroMosse;
struct mossa_t *P_mosse;
}partita;
typedef partita *list;
typedef mossa *mox;
Nel mio fun.c invece Codice:
for(j = 0; j < numeroPartite; j++)
for(k = 0; k <= (P_testa[j].numeroMosse - numeroMosse); k++)
if(!strcmp(P_testa[j].P_mosse[k].coordinataBianco, P_sequenza[0].coordinataBianco ) )
if(!strcmp(P_testa[j].P_mosse[k].coordinataNero, P_sequenza[0].coordinataNero ) )
analizza_e_stampa(P_testa[j].P_mosse[k], P_sequenza[1], numeroMosse);
Codice:
int analizza_e_stampa(struct mossa_t P_testa[j].P_mosse[k], mox P_sequenza[1], int numeroMosse) Nell'analizza_e_stampa ho bisogno di continuare a scalare il vettore di struct P_mosse e P_sequena... Come si fa? |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Non puoi sapere al momento della compilazione quale sarà la dimensione dell'array da ricevere nella funzione, quindi ti toccherà usare un puntatore.
Codice:
int analyzeAndPrint(struct mossa_t *vec, /* ... */)
{
/* ... */
}
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Dec 2003
Città: Hamburg/Torino
Messaggi: 2757
|
Infatti, ho optato per passare anche gli indici separatamente
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Dec 2003
Città: Hamburg/Torino
Messaggi: 2757
|
Ora pero' se provo a fare una stupidissima bubblesort mi da' errore
Codice:
list bubblesort(list v, int N)
{
int i, j;
list tmp;
for(i = 1; i < N; i++)
{
for(j = N - 1; j >= 1; j--)
if(v[j - 1].fixed_data > v[j].fixed_data)
{
tmp = v[j - 1];
v[j - 1] = v[j];
v[j] = tmp;
}
}
return v;
}
error: incompatible types in assignment Perche'? E soprattutto come faccio a risolverlo? Ps: la chiamo con Codice:
P_testa = bubblesort(P_testa, numeroPartite); |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: May 2004
Città: Napoli
Messaggi: 773
|
temp deve essere di tipo partita, non partita* (ossia list)
__________________
If builders built buildings the way programmers wrote programs, then the first woodpecker that came along would destroy civilization. --Gerald Weinberg |
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
Il fatto è che la funzione dovrebbe ricevere un puntatore a list, altrimenti dereferenziando un singolo elemento (con v[j-1] e simili) perdi il puntatore e torni ad ottenere una struttura. Io solitamente faccio così le mie dichiarazioni: Codice:
struct __node
{
int data;
struct __node *next;
};
typedef struct __node *node;
typedef node *list;
ciao
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Dec 2003
Città: Hamburg/Torino
Messaggi: 2757
|
In teoria dovrei cercarlo di farlo con la bubblesort restando il più fedele possibile a come l'ho impostato, è possibile?
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Intendi con "un puntatore in meno"? Certo che puoi, ma o devi fare una copia membro a membro, o usi memcpy(&destinazione, &sorgente, sizeof(partita)).
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Dec 2003
Città: Hamburg/Torino
Messaggi: 2757
|
Voglio dire, ho un vettore statico di struct partita, e vorrei ordinarlo secondo l'algoritmo della bubblesort...come devo modificare di conseguenza la mia funzione?
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
E te l'ho detto un attimo fa...
Allora, tu non puoi usare un puntatore, che è "assegnabile" perché è solo un numero, e non un tipo di dato "strutturato". Le soluzioni sono:
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Dec 2003
Città: Hamburg/Torino
Messaggi: 2757
|
Hai ragione scusami...
ora mi studio un pò la memcopy |
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Dec 2003
Città: Hamburg/Torino
Messaggi: 2757
|
Continua a darmi "incompatible types" anche con la memcpy
Codice:
memcpy(tmp, v[j - 1], sizeof(partita) );
memcpy(v[j - 1], v[j], sizeof(partita) );
memcpy(v[j], tmp, sizeof(partita) );
Edit: segmentation fault |
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Dec 2003
Città: Hamburg/Torino
Messaggi: 2757
|
Codice:
memcpy(&tmp, &v[j - 1], sizeof(partita) );
memcpy(&v[j - 1], &v[j], sizeof(partita) );
memcpy(&v[j], &tmp, sizeof(partita) );
Edit: noto che appena faccio la prima memcopy mi sputtana gli indici i e j, assumono dei valori enormi..
__________________
elect86 TAV: le ragioni liberali del no PARTECIPA AI PROGETTI DI CALCOLO DISTRIBUITO CON BOINC.Italy! Ultima modifica di elect : 15-07-2008 alle 13:10. |
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
La variabili locali i e j ti si sputtanano perché tmp non ha bisogno di essere passato come &tmp a memcpy().
Codice:
memcpy(tmp, &v[j - 1], sizeof(partita)); memcpy(&v[j - 1], &v[j], sizeof(partita)); memcpy(&v[j], tmp, sizeof(partita));
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Dec 2003
Città: Hamburg/Torino
Messaggi: 2757
|
E' davvero strano, cosi' come hai detto tu funza, ho provato con un po' di watch ed e' tutto ok
arrivo pero' alla printf per vedere se ordina correttamente...segmentation fault Codice:
for(i = 0; i < numeroPartite; i++)
{
printf("\n\nLuogo: %s\tData: %ld\tBianco: %s\nNero: %s\tNumero Mosse: %i\n", P_testa[i].luogo,
P_testa[i].fixed_data, P_testa[i].giocatoreBianco, P_testa[i].giocatoreNero,
P_testa[i].numeroMosse);
for(j = 0; j < P_testa[i].numeroMosse; j++)
printf("\nMossa Bianco: %s\tMossa Nero: %s\t\n", P_testa[i].P_mosse[j].coordinataBianco,
P_testa[i].P_mosse[j].coordinataNero);
}
|
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Dec 2003
Città: Hamburg/Torino
Messaggi: 2757
|
Anche se tolgo quella parte della stampa continua a farmi Seg Fault
qui il mio fun.c completo Codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "fun.h"
#define MAX 10
#define MAX_S 350
static int numeroPartite;
list leggi_e_carica(void)
{
char filename[MAX + 1], buffer[MAX_S], *luogo, s[] = "# .\n";
char *data_gg, *data_mm, *data_aaaa, *giocatoreBianco, *giocatoreNero, *numeroMosse;
char *coordinataBianco, *coordinataNero;
FILE *stream;
int i = 0, j;
list P_testa;
printf("\nInserisci il nome del file contenente l'archivio delle partite: ");
scanf("%s", filename);
if( (stream = fopen(filename, "r") ) == NULL)
{
printf("\Errore nell'apertura del file %s !", filename);
getchar();
return NULL;
}
fgets(buffer, MAX_S, stream); //niente MAX_S - 1
numeroPartite = atoi(buffer);
P_testa = calloc(numeroPartite, sizeof(partita) );
while(fgets(buffer, MAX_S, stream) )
{
if(buffer[0] == '#')
{
luogo = strtok(buffer, s);
P_testa[i].luogo = calloc(strlen(luogo), sizeof(char) );
strcpy(P_testa[i].luogo, luogo);
data_gg = strtok(NULL, s);
data_mm = strtok(NULL, s);
data_aaaa = strtok(NULL,s);
P_testa[i].fixed_data = aggiustaData(data_gg, data_mm, data_aaaa);
giocatoreBianco = strtok(NULL, s);
P_testa[i].giocatoreBianco = calloc(strlen(giocatoreBianco), sizeof(char) );
strcpy(P_testa[i].giocatoreBianco, giocatoreBianco);
giocatoreNero = strtok(NULL, s);
P_testa[i].giocatoreNero = calloc(strlen(giocatoreNero), sizeof(char) );
strcpy(P_testa[i].giocatoreNero, giocatoreNero);
numeroMosse = strtok(NULL, s);
P_testa[i].numeroMosse = atoi(numeroMosse);
}
if(P_testa[i].numeroMosse != 0)
{
P_testa[i].P_mosse = calloc(P_testa[i].numeroMosse, sizeof(mossa) );
j = 0;
while(j < P_testa[i].numeroMosse)
{
fgets(buffer, MAX_S, stream);
coordinataBianco = strtok(buffer, s);
strcpy(P_testa[i].P_mosse[j].coordinataBianco, coordinataBianco);
coordinataNero = strtok(NULL, s);
strcpy(P_testa[i].P_mosse[j].coordinataNero, coordinataNero);
j++;
}
}
i++;
}
P_testa = bubblesort(P_testa, numeroPartite);
for(i = 0; i < numeroPartite; i++)
{
printf("\n\nLuogo: %s\tData: %ld\tBianco: %s\nNero: %s\tNumero Mosse: %i\n", P_testa[i].luogo,
P_testa[i].fixed_data, P_testa[i].giocatoreBianco, P_testa[i].giocatoreNero,
P_testa[i].numeroMosse);
for(j = 0; j < P_testa[i].numeroMosse; j++)
printf("\nMossa Bianco: %s\tMossa Nero: %s\t\n", P_testa[i].P_mosse[j].coordinataBianco,
P_testa[i].P_mosse[j].coordinataNero);
}
return P_testa;
}
int aggiustaData(char *data_gg, char *data_mm, char *data_aaaa)
{
int dataAssoluta;
dataAssoluta = (atoi(data_aaaa) * 100);
dataAssoluta += atoi(data_mm);
dataAssoluta *= 100;
dataAssoluta += atoi(data_gg);
return dataAssoluta;
}
list bubblesort(list v, int N)
{
int i, j;
list tmp;
for(i = 1; i < N; i++)
{
for(j = N - 1; j >= 1; j--)
if(v[j - 1].fixed_data > v[j].fixed_data)
{
/*memcpy(tmp, &v[j - 1], sizeof(partita) );
memcpy(&v[j - 1], &v[j], sizeof(partita) );
memcpy(&v[j], tmp, sizeof(partita) );*/
}
}
return v;
}
int leggi_e_ricerca(char *filename, list P_testa)
{
char coordinataBianco[MAX + 1], coordinataNero[MAX + 1];
FILE *stream;
int numeroMosse, i, j;
mox P_sequenza;
if( (stream = fopen(filename, "r") ) == NULL)
printf("\nErrore nell'apertura del file %s", filename);
else
{
fscanf(stream, "%i", &numeroMosse);
P_sequenza = calloc(numeroMosse, sizeof(mossa) );
for(i = 0; i < numeroMosse; i++)
{
fscanf(stream, "%s%s", coordinataBianco, coordinataNero);
strcpy(P_sequenza[i].coordinataBianco, coordinataBianco);
strcpy(P_sequenza[i].coordinataNero, coordinataNero);
}
for(i = 0; i < numeroPartite; i++)
for(j = 0; j <= (P_testa[i].numeroMosse - numeroMosse); j++)
if(strcmp(P_testa[i].P_mosse[j].coordinataBianco, P_sequenza[0].coordinataBianco ) == 0)
if(strcmp(P_testa[i].P_mosse[j].coordinataNero, P_sequenza[0].coordinataNero ) == 0)
analizza_e_stampa(P_testa, i, j, P_sequenza, numeroMosse);
}
return 0;
}
int analizza_e_stampa(list P_testa, int i, int j,mox P_sequenza, int numeroMosse)
{
int x = 1;
j++;
while(x < numeroMosse &&
strcmp(P_testa[i].P_mosse[j].coordinataBianco, P_sequenza[x].coordinataBianco) == 0 &&
strcmp(P_testa[i].P_mosse[j].coordinataNero, P_sequenza[x].coordinataNero) == 0)
{
j++;
x++;
}
if(x == numeroMosse)
{
j -= numeroMosse;
printf("\nLuogo: %s\tData: ", P_testa[i].luogo);
stampaData(P_testa[i].fixed_data);
printf("\nGiocatore Bianco: %s", P_testa[i].giocatoreBianco);
printf("\tGiocatore Nero: %s", P_testa[i].giocatoreNero);
printf("\nLa sequenza desiderata e' stata riconosciuta dal numero della");
printf(" coppia di mosse %i\n", j + 1);
}
return 0;
}
int stampaData(int dataAssoluta)
{
int anno, data, mesi, giorni;
anno = dataAssoluta / 10000;
printf("%i.", anno);
data = dataAssoluta - anno * 10000;
mesi = data / 100;
printf("%i.", mesi);
giorni = data - mesi * 100;
printf("%i", giorni);
return 0;
}
|
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
%i??
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! Ultima modifica di DanieleC88 : 16-07-2008 alle 00:22. |
|
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
![]() Ma scordati che io faccia il debugging di tutto quel file... almeno, non oggi, non è certo l'ora di fare questa roba... ciao
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#19 | ||
|
Senior Member
Iscritto dal: Dec 2003
Città: Hamburg/Torino
Messaggi: 2757
|
Quote:
%i o %d e' uguale per gli interi Quote:
__________________
elect86 TAV: le ragioni liberali del no PARTECIPA AI PROGETTI DI CALCOLO DISTRIBUITO CON BOINC.Italy! Ultima modifica di elect : 16-07-2008 alle 07:05. |
||
|
|
|
|
|
#20 | ||
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
Appunto, perché ne usi uno ora e subito dopo usi l'altro? Fai una scelta e mantienila uniformemente nel codice! Quote:
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
||
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 16:51.





















