How to use STRUCT with FIFO - c

I'm learning "FIFO" in C this is my first code trying to pass an struct by argument to FIFO function but it's not working as expected... And I can't figure why. Someone could please give me hand an explain what am I doing wrong?
I wrote my code in portuguese if it's hard to you guys understand let me know I'll translate to english.
#define TAMANHO 3
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
typedef struct
{
char Nome[20];
} pretendentes;
pretendentes // nome da estrutura
pessoas[10]; // vetor de estrutura
int main(void)
{
setlocale(LC_ALL, "");
cadastroPretendentes(pessoas);
qstore(pessoas);
}
void qstore(pretendentes *Pessoas)
{
int pfinal = 0;
int pinicial = 0;
if(pinicial == TAMANHO)
{
printf("A fila está cheia.");
return;
}
pessoas[pinicial] = Pessoas.Nome;
pinicial++;
}
void cadastroPretendentes(pretendentes *Pessoas)
{
int i;
for(i = 0; i < TAMANHO; i++)
{
printf("Insira o nome do pretendente %d: ", i+1);
scanf("%s", (*(Pessoas + i)).nome);
}
}

assume that pessoas is fifo memory.
In cadastroPretendentes(), you are getting names and store into fifo memory and in qstore(), you are writing pessoas[0] with pessoas[0].
if qstore is called another 2 times, 1st and 2nd elements in array will be replaced with pessoas[0].
In this code, qstore is not required as cadastroPretendentes() gets name and stores in pessoas (fifo memory)

Related

Change values in a struct array

Can someone explain me, please, why can't I insert values into a struct array.
Here's a piece of my code to help understand what I'm trying to accomplish.
I want to insert values inside an array which is formed by structs, whenever I try to insert values it gives me a segmentation error.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TAM_TABELA 10
#define PRIMO 7
#define MAX_NOME 50
typedef struct {
char nome[MAX_NOME];
int telemovel;
} pessoa;
void insert(pessoa *grupo[]) {
char nome[MAX_NOME];
printf("\nInsert name:\n");
scanf("%s", nome);
int lenght = strnlen(nome, MAX_NOME);
printf("\nInsert phone:\n");
scanf("%d", &tel);
for (i = 0; i < TAM_TABELA; i++) {
if (grupo[i] == NULL) {
grupo[i]->telemovel = tel;
strcpy(grupo[i]->nome, nome);
break;
}
}
if (i == TAM_TABELA)
printf("\nO valor não pode ser inserido!\n");
}
void main() {
int opt;
pessoa p;
pessoa grupo[TAM_TABELA] = {NULL};
insert(grupo);
}
You need to pass the address of grupo to insert() function.
int main(void) { } is a valid C main() function prototype
size_t is a valid data type for lengths, iterate through arrays
Always check whether scanf() conversion was successful or not
Do not use "%s", use "%<WIDTH>s", to avoid buffer-overflow
for( i = 0; i < TAM_TABELA; i++) i was never defined
parameter of the function insert() should be pessoa ***grupo, in de-reference it later in your function like *grupo
Initialize your char [] using {}, which are stored on stack memory
for (i = 0; i < TAM_TABELA; i++) {
if (grupo[i] == NULL) {
grupo[i]->telemovel = tel;
strcpy(grupo[i]->nome, nome);
break;
}
}
Notice how you've checked that grupo[i] is NULL and then you try to access a struct member on that value that is NULL.
You possibly want to check that grupo[i] != NULL, which should make member access safe.

How to read pointer to string in my main function, error "expected argument of char* in scanf"

I am a beginner learning C.
I am trying to write two functions, one to allocate a string and the other to insert string1 in string2 from position i.
my code:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <unistd.h>
//alocation
char * allouerChaine(int n)
{
char * s =(char*)malloc(n*sizeof(char *));
if(s!=NULL)
return s;
exit(-1);
}
char * strinsert(char *M, char* T ,int i)
{
char * temp=allouerChaine(strlen(M)+strlen(T));
strncpy(temp,M,i);
temp[i]='\0';
strcat(temp,T);
strcat(temp,M+i);
temp[strlen(M)+strlen(T)]='\0';
return temp;
}
int main(){
char *M;
char *T;
char*p;
int i;
printf("faites entre la chaine M: ");
scanf("%s",&M);
printf("\nfaites entre la chaine T: ");
scanf("%s",&T);
printf("faites entrer I: ");
scanf("%d",&i);
p=strinsert(M, T ,i);
printf("%s",p);
return 0;
}
when I try with static strings like :
p=strinsert("hello", "ss" ,2);
printf("%s",p);
the code works, which means I don't have a problem with my functions but I do have a problem inside the main.

Stack around variable "struc" is corrupted

So I'm facing a problem with Visual Studio 2013
This code shows no compilation errors but a debug error
Stack around the variable 'Joueur' was corrupted.
This is the code:
== Source.cpp
#include <stdlib.h>
#include <stdio.h>
#include "Header.h"
int main()
{
Personne Joueur[2];
printf("***** Bienvenue ***** \n \n \n");
int k ;
for (k = 0; k < 3; k++)
{
printf("Bonjour Joueur %d :\n", k+1);
printf("Nom: ");
fgets(Joueur[k].Nom,50,stdin);
printf("Votre nom est: %s", &Joueur[k].Nom);
printf("\n \n");
}
return 0;
}
== Header.h
typedef struct Personne Personne;
struct Personne
{
char Nom[1500];
char Prenom[1500];
int Age;
int Tel;
double Moy;
};
Change Personne Joueur[2]; -> Personne Joueur[3];
You do not have enough memory to hold more than 2 structures.
You are trying to more values into Joueur[2] than memory. So, there is not enough memory to hold the more then two values.
You are overrunning the allocated memory and it invokes undefined behaviour. So, Define a array bigger enough to hold the values. SO, change your array value according to sas answer.

File writing and struct arrays in C

The includes,
#include <time.h> /* para calcular data e duracao */
#include <sys/time.h> /* para duracao */
#include <stdio.h>
#include <string.h>/* para limpar a tela durante os menus */
#define FILENAME "RelatoriosClimaticos.bin"
#include <stdlib.h>
#include <ctype.h>
#include <unistd.h>
I have a struct defined like this:
typedef struct RelatorioClimatico
{
char nomeLocal [50];
struct tm dataColeta;
int temperatura;
}RelatorioClimatico;
And i have this function that tries to write random values to a binary file:
void createRandomFilesByFileSize(FILE *fpp, long int requestedSize) //Opção 2
{
struct timeval tm_ini, tm_fim;
gettimeofday(&tm_ini, NULL);
long int x=0, registriesNeededForSize, registryBlock;
int y=0;
struct tm dataColeta;
int size = sizeof(RelatorioClimatico);
RelatorioClimatico *relatorioClimatico = malloc(sizeof(RelatorioClimatico) * 27849);
registriesNeededForSize = (int)(requestedSize/184);
registryBlock = (int)(requestedSize/184)/27849;
rewind(fpp);
while(x<registryBlock)
{
while(y<27849)
{
NameGen(relatorioClimatico[y].nomeLocal);
fflush(stdin);
relatorioClimatico[y].dataColeta = GeraData();
fflush(stdin);
relatorioClimatico[y].temperatura = rand() % 45;
fflush(stdin);
}
x++;
y=0;
fseek(fpp, size, SEEK_END);
fwrite(&relatorioClimatico, size*27849, 1, fpp);
x++;
}
rewind(fpp);
gettimeofday(&tm_fim, NULL);
double diff_sec = difftime(tm_fim.tv_sec, tm_ini.tv_sec);
double diff_milli = difftime(tm_fim.tv_usec, tm_ini.tv_usec)/1000000;
printf("Os %i relatorios foram gerados em %f segundos, e o arquivo resultando possui %ld bytes \n",registriesNeededForSize, diff_sec+diff_milli, ftell(fpp));
}
So what i am not being able to do is to create this typedefined RelatorioClimatico variable:
RelatorioClimatico *relatorioClimatico = malloc(sizeof(RelatorioClimatico) * 27849);
Where RelatorioClimatico is the struct, and i want it to be an array of exactly 27849 positions.
I tried this before but it gave me an error:
RelatorioClimatico relatorioClimatico[27849];
Any help would be greatly appreciated, thanks in advance

Find if string exist in a vector of structs

Good afternoon,
I'm here with a doubt that i am not able to overcome and i've tried a number of ways. I'm doing a program that among other things the user has to enter data about a product where the serial number has to be unique and of type char. What is happening is that when i type the 1st product serial number the program returns that is already a product with this serial number despite being the 1st.
Here's the code I have:
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
char numeroserie;
char descricao;
float preco;
} stProduto;
/********************** Funcoes dos produtos *************************/
void inserirProduto(stProduto produtos[], int *contadorProdutos);
int procurarNumeroserie(stProduto produtos[], int contadorProdutos, char produtoAProcurar);
int main()
{
stProduto produtos[500];
int contadorProdutos=0;
inserirProduto(produtos,&contadorProdutos);
return 0;
}
void inserirProduto(stProduto produtos[], int *contadorProdutos)
{
char string1;
char posicao;
do
{
printf("Introduza o numero de serie do produto:");
scanf("%s",&string1);
posicao = procurarNumeroserie(produtos,*contadorProdutos, string1);
if (posicao == 0)
{
printf("Ja existe um produto com esse numero de serie!!!\n");
}
}
while(posicao == 0);
strcpy(produtos[*contadorProdutos].numeroserie,string1);
(*contadorProdutos)++;
}
int procurarNumeroserie(stProduto produtos[], int contadorProdutos, char produtoAProcurar)
{
int i;
char posicao;
posicao = 0;
for(i = 0 ; i < contadorProdutos ; i++)
{
if (strcmp(produtos[i].numeroserie, produtoAProcurar) == 0)
{
posicao=i;
i=contadorProdutos;
}
}
return posicao;
}
Someone help please !!I am already getting frustrated.
Thanks
You got it wrong, char is not a string type in c, it's an integer type.
A string is defined as a sequence of bytes non-nul that are followed by a nul byte.
They type char is 1 byte and hence a string can be an array of char, like the following
char string[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
/* ^ nul: it's mandatory
* for this to be a
* string
*/
The code you posted above seems to be Java originally with some fixes to make it compile, but if you enable compilation warnigs the compiler will really piss you off.
You can build a string from an array like I did above, or by using a pointer of char, in that case you need to point to an array or to dynamic memory allocated using malloc().
An example would be
char *hello;
hello = malloc(6);
if (hello == NULL)
return ERROR; /* or whatever is need but do not continue */
strcpy(hello, "Hello");
/* do whatever you want with hello */
free(hello);
I have managed to put i to work:
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
char numeroserie[9];
char descricao;
float preco;
} stProduto;
/********************** Funcoes dos produtos *************************/
void inserirProduto(stProduto produtos[], int *contadorProdutos);
int procurarNumeroserie(stProduto produtos[], int contadorProdutos, char produtoAProcurar[9]);
int main()
{
stProduto produtos[500];
int contadorProdutos=0;
inserirProduto(produtos,&contadorProdutos);
return 0;
}
void inserirProduto(stProduto produtos[], int *contadorProdutos)
{
char string1[9];
char posicao;
do
{
printf("Introduza o numero de serie do produto:");
scanf("%s",&string1);
posicao = procurarNumeroserie(produtos,*contadorProdutos, string1);
if (posicao == 0)
{
printf("Ja existe um produto com esse numero de serie!!!\n");
}
}
while(posicao == 0);
strcpy(produtos[*contadorProdutos].numeroserie,string1);
(*contadorProdutos)++;
}
int procurarNumeroserie(stProduto produtos[], int contadorProdutos, char produtoAProcurar[9])
{
int i;
char posicao;
posicao = 0;
for(i = 0 ; i < contadorProdutos ; i++)
{
if (strcmp(produtos[i].numeroserie, produtoAProcurar) == 0)
{
posicao=i;
i=contadorProdutos;
}
}
return posicao;
}
Putting numeroserie [8] i assure that the user just insert 8 characters ??
Thanks

Resources