Torna indietro   Hardware Upgrade Forum > Software > Programmazione

MSI PRO MAX EDGE AI+, Ryzen AI Max+ 395 e 128 GB per far girare in locale anche i modelli più grandi
MSI PRO MAX EDGE AI+, Ryzen AI Max+ 395 e 128 GB per far girare in locale anche i modelli più grandi
Abbiamo provato MSI PRO MAX EDGE AI+, un mini-PC professionale progettato per eseguire modelli di intelligenza artificiale in locale, senza dipendere dal cloud. Il sistema abbina il processore AMD Ryzen AI Max+ 395, 128 GB di memoria unificata e un telaio in alluminio da appena 4 litri, con l'obiettivo di offrire capacità di elaborazione elevate in un formato compatto.
Recensione vivo X500 Pro Max: la fotografia mobile ha un nuovo protagonista
Recensione vivo X500 Pro Max: la fotografia mobile ha un nuovo protagonista
Il nuovo top di gamma vivo punta su un comparto fotografico particolarmente articolato, con un teleobiettivo da 200 megapixel e teleconvertitori esterni capaci di arrivare a 400 mm equivalenti. Lo abbiamo provato a Tenerife, mettendo alla prova fotocamere, prestazioni, autonomia e accessori. Ecco come si è comportato.
WoW Forever: la beta è stato uno dei momenti più alti della storia dei videogiochi, e non si ripeterà
WoW Forever: la beta è stato uno dei momenti più alti della storia dei videogiochi, e non si ripeterà
Un mondo affollato e vivo, personaggi destinati a sparire a fine test e nessuno a inseguire l'oggetto giusto. Beta e stress test di World of Warcraft: Forever hanno fatto emergere un roleplay spontaneo, tra danze a Goldshire e code ordinate ai PNG
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 13-06-2008, 20:50   #1
braian
Member
 
L'Avatar di braian
 
Iscritto dal: Apr 2007
Messaggi: 153
[C]errori redefinition e previous declaration

Salve a tutti, sto facendo un progetto in c in cui ho 3 file header: tipiAllocatore.h, allocatore.h, funzioniServizio.h e 1 file c allocatore.c

In uno header ho le strutture dati che utilizzo e che sembrano darmi problemi, specialmente con gli ide Eclipse o Netbeans.

in allocatore.h ho le definizioni delle funzioni,
in funzioniServizio le definizioni delle funzioni di servizio,
il file tipiAllocatore.h è il seguente:
Codice:
/*
macro per valori logici
*/
#define TRUE 1
#define FALSE 0
/*
macro per la gestione degli errori
*/
#define ERROR_INIZIALE		-1
#define ERROR_NESSUNERRORE	0
#define ERROR_MALLOC		1
#define ERROR_NUMEROHANDLE	2
#define ERROR_SPAZIOLIBERO	3
#define ERROR_ZEROVAL		4
#define ERROR_NULLVAL		5
#define ERROR_POSIZIONE		6

/*
struttura usata per rappresentare un byte
*/
typedef unsigned char byte;

/*
struttura usata per rappresentare un valore logico
*/
typedef int boolean;

/*
struttura dati usata per rappresentare gli elementi della tabellaAllocazioni
*/
typedef struct
{
	int id;
	int base;
	int limite;
	struct elementoTabella next;
}elementoTabella;



/*
struttura dati usata per rappresentare lo heap
*/
typedef struct 
{
	int spazioLibero;
	byte* strutturaHeap;
	int dimensioneHeap;
	int numeroHandle;
	int numeroAttualeHandle;
	elementoTabella* tabellaAllocazioni ;
}heap;
e l' allocatore.c il seguente:
Codice:
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include "tipiAllocatore.h"
#include "allocatore.h"
#include "funzioniServizio.h"

/*

typedef unsigned char byte;


struttura dati usata per rappresentare gli elementi della tabellaAllocazioni

typedef struct elementoTabella
{
	int id;
	int base;
	int limite;
}

/*
struttura dati usata per rappresentare lo heap

typedef struct heap
{
	byte* strutturaHeap;
	int dimensioneHeap;
	int numeroHandle;
	int numeroAttualeHandle;
	elementoTabella* tabellaAllocazioni
}

*/

static int codiceErrore=ERROR_INIZIALE;


/*
crea un nuovo heap, capace di gestire al più nhandles handle, e con uno spazio per i dati di size bytes.
*/
heap *createH(int nhandles, int size)
{
	if (size == 0)
	{
		codiceErrore = ERROR_ZEROVAL;
		return NULL;	
	}
	if (nhandles == 0)
	{
		codiceErrore = ERROR_ZEROVAL;
		return NULL;	
	}
	heap* _heap = (heap*)malloc(sizeof(heap));
	if (_heap == NULL)
	{
		codiceErrore = ERROR_MALLOC;
		return NULL;	
	}
	_heap->spazioLibero = size;
	_heap->dimensioneHeap = size;
	_heap->numeroHandle = nhandles;
	_heap->numeroAttualeHandle = 0;
	_heap->tabellaAllocazioni = NULL;
	_heap->strutturaHeap = (byte*)malloc(size);
	if (_heap->strutturaHeap == NULL)
	{
		codiceErrore = ERROR_MALLOC;
		return NULL;	
	}
}

/*
alloca size bytes nello heap h, restituisce il puntatore a un handle (o NULL in caso di errore). Se c'è sufficiente spazio disponibile, ma non contiguo, effettua una ricompattazione e poi alloca il blocco.
*/
void **allocH(heap *h, int size)
{
	if(h == NULL)
	{
		codiceErrore = ERROR_NULLVAL;
		return NULL;
	}	
	if(size == 0)
	{
		codiceErrore = ERROR_ZEROVAL;
		return NULL;
	}
	if(h->numeroAttualeHandle == h->numeroHandle)
	{
		codiceErrore = ERROR_NUMEROHANDLE;
		return NULL;
	}
	if(h->spazioLibero<size)
	{
		codiceErrore = ERROR_SPAZIOLIBERO;
		return NULL;
	}
	elementoTabella* elemento = (elementoTabella*)malloc(sizeOf(elementoTabella));
	if (elemento == NULL)
	{
		codiceErrore = ERROR_MALLOC;
		return NULL;	
	}
	elemento->next = NULL;
	int posizione = calcolaPosizione(h,size);
	if (posizione = -1)
	{
		codiceErrore = ERROR_POSIZIONE;
		return NULL;
	}
}

/*
libera la memoria allocata dall'handle handle nello heap h. L'handle deve essere stato ottenuto da una precedente chiamata a allocH().
*/
void freeH(heap *h, void **handle);

/*
restituisce la quantità di spazio libero nello heap h (ovvero, la somma della dimensione di tutti gli eventuali frammenti liberi).
*/
int availH(heap *h);

/*
forza una ricompattazione dello heap h.
*/
void compactH(heap *h);

/*
distrugge lo heap h; dopo questa operazione, tutti gli handle ottenuti da allocH() su quello heap sono invalidi.
*/
void destroyH(heap *h);




int _error()
{
	return codiceErrore;
}




/****************************************************************
*								*
*			FUNZIONI DI SERVIZIO			*
*								*
****************************************************************/


/*
Calcola l'offset rispetto alla base dello heap _heap, in cui lo spazio da allocare; eventalmente compatta lo heap.
*/
static int calcolaPosizione(heap* _heap, int size)
{
	if((_heap == NULL) || (size == 0))
	{
		return -1;
	}
	boolean disponibile = FALSE;
	elementoTabella* riga = _heap->tabellaAllocazioni;
	while ( riga != NULL )
	{
		//se c'è una riga un altra area di memoria allocata con indirizzo superiore 
		if(riga->next != NULL)
		{
			//se c'è abbastanza spazio tra le 2 aree di memoria considerate per inserire quella nuova, vi inserisco quest'ultima
			if(riga->next->base-(riga->limite)>size)
			{
				return riga->limite+1;
			}
		}
		//altrimenti se non ci sono altre aree di memoria ma lo spazio fino alla fine dello heap è sufficente a contenere la nuova area di memoria
		else if((_heap->dimensioneHeap-riga->limite)>size)
		{
			return riga->limite+1;
		}
		riga=riga->next;
	}
	compactH(_heap);
	
}

gli errori che ho come detto sono sulle strutture e mi vengono dati con eclipse e netbeans ma non con la compliazione da riga di comando: praticamente per ogni typedef usato ho gli errori REDEFINITION OF TYPEDEF <TIPODATO>
e anche PREVIOUS DEFINITION OF <TIPODATO> WAS HERE
oltre ad un errore nella struct elementoTabella
typedef struct elementoTabella
{
int id;
int base;
int limite;
struct elementoTabella next;
};
dove anche con la compilazione da riga di comando ho l'errore FIELD NEXT HAS INCOMPLETE TYPE

Vi sarei davvero grato se poteste darmi una mano
braian è offline   Rispondi citando il messaggio o parte di esso
Old 14-06-2008, 09:38   #2
braian
Member
 
L'Avatar di braian
 
Iscritto dal: Apr 2007
Messaggi: 153
up, sarebbe davvero importante
braian è offline   Rispondi citando il messaggio o parte di esso
Old 14-06-2008, 09:47   #3
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
proteggi dall'inclusione multipla: #pragma once all'inizio di ciascun header se il compilatore la supporta, altrimenti:
Codice:
#ifndef __INVENTATI_UNA_MACRO__
#define __INVENTATI_UNA_MACRO__

// codice dell'header

.
.
.

#endif
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 14-06-2008, 11:09   #4
braian
Member
 
L'Avatar di braian
 
Iscritto dal: Apr 2007
Messaggi: 153
Si, è vero, grazie...ci ero arrivato grazie a Dio... casualmente ho inserito in eclipse un header che aveva all'inizio ifndef Macro.... e andava bene, ho risolto anche l'altro errore che era perchè chiamavo sizeOf invecie di sizeof.... se hai tempo e non ti dispiace potresti spiegarmi meglio il fatto di dover proteggere dalla inclusione doppia e di usare le macro in questo modo? Questo errore non mi sembrava lo desse se compilavo da riga di comando...ma forse mi sbaglio...

per l'altro errore sulla lista che intendevo fare ho risolto cambiando da :
Codice:
typedef struct elementoTabella
{
int id;
int base;
int limite;
struct elementoTabella next;
};
a
Codice:
typedef struct elementoTabella
{
int id;
int base;
int limite;
struct elementoTabella next;
}elementoTabella;
grazie ancora

Ultima modifica di braian : 14-06-2008 alle 11:13.
braian è offline   Rispondi citando il messaggio o parte di esso
Old 14-06-2008, 13:56   #5
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da braian Guarda i messaggi
se hai tempo e non ti dispiace potresti spiegarmi meglio il fatto di dover proteggere dalla inclusione doppia e di usare le macro in questo modo?
non so come tu compili da linea di comando, comunque: la direttiva di preprocessore #include equivale concettualmente ad incollare al posto di quella riga pari pari l'intero file sorgente indicato, ne' più ne' meno; C e C++ non hanno il concetto di import, di package, e cose simili, ma solo di inclusione. l'errore in cui ti sei imbattuto è dovuto ad una combinazione di inclusioni che durante la compilazione di uno dei sorgenti hanno provocato l'inclusione multipla di uno stesso header, per esempio perché quell'header è stato incluso sia dal sorgente compilato sia da un altro header a sua volta incluso nel sorgente compilato. il risultato è che il compilatore ha letto due volte l'header, incontrando due volte tutte le definizioni (vale non solo per le typedef ma per qualsiasi altra cosa: anche per i #define ad esempio).

con la protezione #ifndef/#define fai in modo che l'header venga letto dal compilatore una volta sola perché esso definisce una macro che fa saltare le letture successive a partire dalla seconda inclusa. per risparmiarti il lavoro di fantasia nel definire i nomi delle macro che proteggono gli headers e la relativa naming convention (che deve fare in modo che quei nomi non collidano accidentalmente con altre macro) i compilatori decenti offrono una direttiva pragma non standard, "#pragma once"; i compilatori Microsoft e Intel ce l'hanno, il MinGW ce l'ha, penso ce l'abbia anche il gcc di Linux.
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 14-06-2008, 15:29   #6
braian
Member
 
L'Avatar di braian
 
Iscritto dal: Apr 2007
Messaggi: 153
grazie mille sei stato chiarissimo
braian è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


MSI PRO MAX EDGE AI+, Ryzen AI Max+ 395 e 128 GB per far girare in locale anche i modelli più grandi MSI PRO MAX EDGE AI+, Ryzen AI Max+ 395 e 128 GB...
Recensione vivo X500 Pro Max: la fotografia mobile ha un nuovo protagonista Recensione vivo X500 Pro Max: la fotografia mobi...
WoW Forever: la beta è stato uno dei momenti più alti della storia dei videogiochi, e non si ripeterà WoW Forever: la beta è stato uno dei mome...
Oracle AI World 2026: in Europa prima la sovranità, poi la sicurezza e solo dopo l'IA Oracle AI World 2026: in Europa prima la sovrani...
DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort DS N°7 E-Tense: il SUV premium made in Melfi...
Black Friday HONOR, prezzi giù fi...
AliExpress sfida Amazon sui prezzi: e-bi...
Gemini sotto accusa in Ungheria: per l'a...
Windows 11 può girare sulla NPU invece d...
MediaWorld diventa cinese: l'UE dice s&i...
Akamai potenzia il proprio cloud con due...
Steam, Valve cambia le regole: le revisi...
Canva licenzia (anche) per colpa dell'IA...
Axerta: l’IA traina la crescita delle te...
Galaxy A38, la batteria cresce ma il pre...
Notifica su Facebook: 'Effettuerai la mi...
Xbox pronta a dire addio allo studio di ...
Meta stacca la spina: fine del supporto ...
Scambio file senza limiti: Google porta ...
Taiwan sbarca a EICMA 2026: maxi scooter...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 17:05.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v