Vinnaren i pepparkakshustävlingen!
2022-04-19, 12:14
  #3205
Medlem
Jag vill initiera och printa ut 5 index ur en dynamisk array.

Problemet är när jag printar ut min array så printas sista värdet ut på samtliga index?

Jag gissar att det har med minnes allockering att göra, att pointer *list[] allockerar samma värde till samtliga index, men hur kan jag åtgärda det?

Kod:
#include <iostream>

using namespace std;

int main()
{
    const int AMOUNT = 5;
    
    char * list[AMOUNT];
    int buflen = 10;
    char buff[buflen] = { "" };
    
    std::cout << "WRITE SOME WORDS" << std::endl;
    
    for(int j = 0; j < AMOUNT ; j++){
        cin.getline(buff,buflen);
        list[j] = buff;
    }
    
    std::cout << "===== PRINT OUT INDEX 2 =====" << std::endl;
    
    std::cout << list[2] << std::endl;
    
    std::cout << "===== TEST =====" << std::endl;
    
    for(int i = 0; i < AMOUNT ; i++){
        std::cout<< list[i] << std::endl;
    }
    
    return 0;
}
Citera
2022-04-19, 12:42
  #3206
Medlem
Enterprises avatar
Citat:
Ursprungligen postat av bosscs2
Jag vill initiera och printa ut 5 index ur en dynamisk array.

Problemet är när jag printar ut min array så printas sista värdet ut på samtliga index?

Jag gissar att det har med minnes allockering att göra, att pointer *list[] allockerar samma värde till samtliga index, men hur kan jag åtgärda det?

Kod:
#include <iostream>

using namespace std;

int main()
{
    const int AMOUNT = 5;
    
    char * list[AMOUNT];
    int buflen = 10;
    char buff[buflen] = { "" };
    
    std::cout << "WRITE SOME WORDS" << std::endl;
    
    for(int j = 0; j < AMOUNT ; j++){
        cin.getline(buff,buflen);
        list[j] = buff;
    }
    
    std::cout << "===== PRINT OUT INDEX 2 =====" << std::endl;
    
    std::cout << list[2] << std::endl;
    
    std::cout << "===== TEST =====" << std::endl;
    
    for(int i = 0; i < AMOUNT ; i++){
        std::cout<< list[i] << std::endl;
    }
    
    return 0;
}
Med risk för att vara på tunn is (eftersom jag arbetar sällan med C); Det är lite samma problem som andra användare har haft i Python och C#-trådarna, du får skilja på referenser och värden. Du använder samma referens, varför det är det senast allokerade strängen som syns i hela listan.

För att kopiera en C-sträng använd strcpy. Kolla följande:

Kod:
#include <iostream>
#include <string.h>

using namespace std;

int main()
{
    const 
int AMOUNT 5;
    const 
int buflen 10;
    
    
char list[AMOUNT][buflen];
    
char buff[buflen+1];
    
    
std::cout << "WRITE SOME WORDS" << std::endl;
    
    for(
int j 0AMOUNT j++){
        
cin.getline(buff,buflen);
        
strcpy(list[j],buff);
      
    }
    
    
std::cout << "===== PRINT OUT INDEX 2 =====" << std::endl;
    
    
std::cout << list[2] << std::endl;
    
    
std::cout << "===== TEST =====" << std::endl;
    
    for(
int i 0AMOUNT i++){
        
std::cout<< list[i] << std::endl;
    }


Kolla även: kolla: https://stackoverflow.com/questions/...f-strings-in-c

I synnerhet detta:
Citat:
If you do want to be able to change the actual string content, the you have to do something like

char a[2][14];
strcpy(a[0], "blah");
strcpy(a[1], "hmm");
This will allocate two consecutive arrays of 14 chars each, after which the content of the static strings will be copied into them.
__________________
Senast redigerad av Enterprise 2022-04-19 kl. 12:44.
Citera
2022-04-20, 09:00
  #3207
Medlem
Citat:
Ursprungligen postat av bosscs2
Jag vill initiera och printa ut 5 index ur en dynamisk array.

Problemet är när jag printar ut min array så printas sista värdet ut på samtliga index?

Jag gissar att det har med minnes allockering att göra, att pointer *list[] allockerar samma värde till samtliga index, men hur kan jag åtgärda det?

Kod:
#include <iostream>

using namespace std;

int main()
{
    const int AMOUNT = 5;
    
    char * list[AMOUNT];
    int buflen = 10;
    char buff[buflen] = { "" };
    
    std::cout << "WRITE SOME WORDS" << std::endl;
    
    for(int j = 0; j < AMOUNT ; j++){
        cin.getline(buff,buflen);
        list[j] = buff;
    }
    
    std::cout << "===== PRINT OUT INDEX 2 =====" << std::endl;
    
    std::cout << list[2] << std::endl;
    
    std::cout << "===== TEST =====" << std::endl;
    
    for(int i = 0; i < AMOUNT ; i++){
        std::cout<< list[i] << std::endl;
    }
    
    return 0;
}
Du använder inget dymamiskt minne i din lösning. Du skapar ett statiskt fält med fem char-pekare. Sedan loopar du fem varv och läser in en sträng i en statisk buffert. Det du sedan gör är att i varje varv sätta pekarna till att peka på den statiska bufferten du läst in strängen i. Så när du skriver ut på slutet så kommer alla pekare att peka till bufferten och värdet som lästs in sist. För att allokera minne dynamiskt så kan du använda någon av malloc/calloc (C) eller new (C++). Sedan kan du kopiera över strängen till det allokerade minnet. Har för mig att det finns en funktion strdup (möjligtvis strdup2) som allokerar dynamiskt minne och gör en kopia av en befintlig sträng.
Citera
2022-04-20, 09:00
  #3208
Medlem
1. Jag allokerar minne till min array genom att göra följande:
char * myarr = new char (BUFLEN);

2. " Sedan kan du kopiera över strängen till det allokerade minnet."
Jag försöker med följande:
Kod:
for(int i = 0; i < 5; i++){
       cin.getline(buff,BUFLEN);
       strcpy(myarr[i],buff);
    }

Det blir en konflikt mellan char och char *. Jag provar också att skriva direkt till arrayen genom att:
Kod:
       const int BUF = 5;
       const int BUFLEN = 100;
       while(count < BUF){
       myarr[count] = new char[BUFLEN];
       cout << "WRITE A WORD" << endl;
       cin >> myarr[count];
       count++;
    }

... Och d funkar det att skriva ut alla strängar men däremot undrar jag om det är rätt? Är det bara skriva direkt till en dynamisk array genom cin >> ?

Kod:
// Online C++ compiler to run C++ program online
#include <iostream>
#include <string.h>

using namespace std;
const int BUFLEN= 100;
const int BUF = 5;
char buff;
int main() {
    char * myarr [BUF];
    int count = 0;
    while(count < BUF){
       myarr[count] = new char[BUFLEN];
       cout << "WRITE A WORD" << endl;
       cin >> myarr[count];
       count++;
    }
    
    for(int i = 0; i < BUF; i++){
        cout << myarr[i] << endl;
    }
    //TEST TO PRINT 2nd index
    cout << myarr[2] << endl;
    
    return 0;
}
}
__________________
Senast redigerad av bosscs2 2022-04-20 kl. 09:33.
Citera
2022-04-20, 14:17
  #3209
Medlem
Enterprises avatar
Citat:
Ursprungligen postat av bosscs2
1. Jag allokerar minne till min array genom att göra följande:
char * myarr = new char (BUFLEN);
Har du kolla detta exempel?
Någon särskilt orsak att du vill köra "C Style-sträng"?
Kod:
#include <iostream>
using namespace std;

int main() {
  

  
    
stringstr=new string[5];   //declaring a dynamic array of string
  
  
for (int i 05i++) {
      
cin>>str[i];      //taking string as input
  
}
  
  for(
int i=0;i<5;i++)
  {
      
cout << str[i] <<endl;  //printing a string
  
}
  
  return 
0;

https://www.codespeedy.com/create-ar...trings-in-cpp/
Citera
2022-04-22, 09:28
  #3210
Medlem
Citat:
Ursprungligen postat av Enterprise
Har du kolla detta exempel?
Någon särskilt orsak att du vill köra "C Style-sträng"?
Kod:
#include <iostream>
using namespace std;

int main() {
  

  
    
stringstr=new string[5];   //declaring a dynamic array of string
  
  
for (int i 05i++) {
      
cin>>str[i];      //taking string as input
  
}
  
  for(
int i=0;i<5;i++)
  {
      
cout << str[i] <<endl;  //printing a string
  
}
  
  return 
0;

https://www.codespeedy.com/create-ar...trings-in-cpp/

Jag har provat och det funkar som jag vill ha det. Det står i uppgiften att det måste vara en c-sträng men lyckades lösa det tillslut, är inte helt 100 på c strängar ännu.
Citera
2022-04-22, 10:53
  #3211
Moderator
Pontiac-Garages avatar
Citat:
Ursprungligen postat av bosscs2
Jag har provat och det funkar som jag vill ha det. Det står i uppgiften att det måste vara en c-sträng men lyckades lösa det tillslut, är inte helt 100 på c strängar ännu.

Tänk bara att en sträng motsvarar en array av bokstäver (chars), i t.ex. C++ kan du deklarera en sträng som en egen datatyp men i C ses en sträng som en samling av chars, som anropas som ett sammanhängande minnesblock.
Citera
2022-04-24, 20:45
  #3212
Medlem
Hur är det gällande headers i makefile, hur ska dessa deklareras?
Har googlat 100 ggr men det är så luddigt beskrivet överallt.

Kod:
program: main.o functions.o
 [TAB]     gcc -o main.o functions.o

main.o: main.c header1.h 
[TAB]    gcc -c main.c

etc..

Tänker jag rätt?
Eller ska headers också deklareras efter program beroendet?
Citera
2022-04-24, 22:55
  #3213
Medlem
kaks avatar
Citat:
Ursprungligen postat av bosscs2
Hur är det gällande headers i makefile, hur ska dessa deklareras?
Har googlat 100 ggr men det är så luddigt beskrivet överallt.

Kod:
program: main.o functions.o
 [TAB]     gcc -o main.o functions.o

main.o: main.c header1.h 
[TAB]    gcc -c main.c

etc..

Tänker jag rätt?
Eller ska headers också deklareras efter program beroendet?
Du gör rätt, dock är ju ett system som detta omöjligt att underhålla när systemet växer.
Varje gång du lägger till en include måste även makefilen uppdateras. Det gäller även om någon fil som inkluderas i sin tur inkluderar andra filer.
Detta måste skötas automatiskt om det ska fungera praktiskt.
Sök på "make automatic dependencies" så får du relevanta träffar.
Alternativt, byt byggsystem till något som hanterar detta utan att du behöver göra något.
Citera
2022-04-26, 19:36
  #3214
Medlem
Citat:
Ursprungligen postat av kak
Du gör rätt, dock är ju ett system som detta omöjligt att underhålla när systemet växer.
Varje gång du lägger till en include måste även makefilen uppdateras. Det gäller även om någon fil som inkluderas i sin tur inkluderar andra filer.
Detta måste skötas automatiskt om det ska fungera praktiskt.
Sök på "make automatic dependencies" så får du relevanta träffar.
Alternativt, byt byggsystem till något som hanterar detta utan att du behöver göra något.

okay ska kolla det, behöver bara öva mer på grunderna först.
En annan fråga men samma karaktär, jag arbetar med en uppgift, den består i att
Makefile är placerad i en projektmapp med ytterligare en mapp -> lib -> som innehåller gdblab.c och gdblab.g.
Allt framgår i makefile filen nedan:
Kod:
CC = gcc
LIBFLAG = -L. -lgdb -Wl,-rpath,.

all: program

program: main.c libgdb.so
    $(CC) -o program main.c $(LIBFLAG)

libgdb.so: lib/gdblab.c lib/gdblab.h 
    $(CC) -c -fPIC lib/gdblab.c
    $(CC) -shared -fPIC -o libgdb.so gdblab.o
		
gdblab.o: lib/gdblab.c lib/gdblab.h
    $(CC) -c lib/gdblab.c

Trots att Makefile uppenbarligen är korrekt skriven skapas ingen object fil av gdblab.c?
Jag behöver objektfilen för att köra (gdb) kommandot men jag begriper inte vad som är fel?
__________________
Senast redigerad av bosscs2 2022-04-26 kl. 19:43.
Citera
2022-04-29, 17:00
  #3215
Medlem
OK det går visst att nå funktioner med (gdb) när man exekverar ett program genom att skriva "step". Man kör alltså inte (gdb) på enskilda objektfiler utan hela program.
Citera
2022-05-15, 18:23
  #3216
Medlem
Stichys avatar
Hej! jag är väldigt färsk på C programmering (har inte kodat över huvudtaget innan, bortsett från lite Arduino).

Jag fick en tanke att man ganska enkelt borde kunna skriva ett program där man skriver in ett tal (som jag kallar "in-värde") och får dess primtalsfaktorer printade.

jag tänkte använda mig av "trial division" ( https://en.wikipedia.org/wiki/Trial_division ) för att ta reda på vilka tal "in-värde" är delbart med("faktorer")..
sedan måste jag ju göra en distinktion mellan de "faktorer" som är primtal och de "faktorer" som inte är primtal..
min tanke är att jag gör an array med alla primtal upp till 300 och säger att om "faktorer" finns i arrayen, printa "faktorer" annars bortse från de som inte finns..

alternativt kan man ju göra en loop till med alla "faktorer" och sålla ut dom som är primtal genom att på något sätt se till att bara spara dom som inte går att dela jämnt med alla "i" för i<="faktor"..

frågor:

1. Vilken lösning är lättast?
2. hur ska jag skriva koden som ska få programmet att sortera ut delbara tal?

jag började skriva precis och har hittills kommit såhär långt:

Citat:
#include<stdio.h>
#include<math.h>


int main(void) {

int in_varde ;
printf("enter number for prime factorisation\n");
scanf("%d", &in_varde);
int rootnumber = sqrt(in_varde);
for(int i=1; i<rootnumber; i++){

}
jag tar tacksamt emot tips på hur jag kan dela upp problemet i subfunktioner för att få en lättare kod i main..
__________________
Senast redigerad av Stichy 2022-05-15 kl. 18:25.
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback