Jak zadeklarować nową nazwę dla CHAR bez zmiany jej wartości?

0

Zadeklarowałem:

char* nowy = "Insignia";

Program coś tam wykonywał ...
Po czasie w nowej linii kodu chciał bym wykonać coś takiego:
char* nowy - nie nazywa się teraz nowy lecz NOWSZY ale bez zmiany wartości
np.
char* nowy ="Insignia" = char* nowszy ="Insignia"

Da się w ogóle to zrobić?

Kod wygląda tak:

#include <stdio.h> /* załączyłem bibilotekę języka C stdio.h  */
int main (){

    char* marka = "Opel";  /* przypisujemy zmienne tekstowe, deklarujemy je */
    char* model = "Astra"; /* zadeklarowałem zmienną MODEL i przypisałem jej wartość ASTRA */

    printf("Witamy w pierwszym programie kota! \n\n"); /* tutaj \n oznacza nową linię, \n\n dwie linie itp. */
    printf("Moj samochod to %s\n", marka);  /* %s wyświetla mi wartość zmiennej */
    printf("Model to %s\n", model);

    char* typ = ":Sedan";  /* tutaj dodałem nową trzecią zmienną */
    printf("Typ karoserii to %s\n", typ);
    printf("Samochod %s %s %s to dobre autko \n\n\n", marka, model, typ); /* zsumowałem dane ze wszystkich zmiennych */

    char* nowy = "Insignia";  /* tu wstawiłem kolejną zmienną o nazwie nowy model auta */
    printf("Od tej chwili moj nowy Opel to %s \n\n\n", nowy);
    /* teraz będę kombinował by zminić nazwę zminnych wstawionych wyżej */

    nowy = "nowszy"

    printf("Teraz insignia powinna nazywać się: %s", nowszy);



    return 0;
}
1

Zwyczajnie przepisz to do nowego wskaźnika:

#include <stdio.h>

int main() {
	char *nowy = "Nowy";
	char *nowszy = nowy;
	printf("%s", nowszy);
	return 0;
}
0

Dzięki serdecznie. Już działa. Dobrze kombinowałem lecz pominąłem * za CHAR ... (Błędy początkującego).
Jeszcze jedno pytanie: jak zmienić wartość w dalszej części kodu?

char *nowszy = nowy;        //to jest ok
    char* nowy ="Insigniunia";    // ale tu wywala błąd 

Najpierw zmieniłem zmienną NOWSZY na NOWY
ale do tej zmiennej był wpis INSIGNIA

Teraz chciał bym pozostawić zmienną NOWY ale zmienić jej wartość z INSIGNIA na INSIGNIUNIA

1

Zrób tak: http://ideone.com/kMUeWA
Tylko tracisz wtedy informację o stałej tekstowej, na którą wskazywał pierwotnie wskaźnik. W moim kodzie taką informację przechowuje obiekt char *nowszy.

W trochę dziwne jest to co tutaj chcesz robić, ponieważ takie przepisywanie wskaźników często prowadzi do tego, że zapomina się o pierwotnie wskazywanej wartości, co powoduje wycieki pamięci, bo np. wskaźnik najpierw wskazywał na jakąś tablicę dynamiczną.

0

Ok, dziękuję, kolejne pytania z czasem :-)

0

Coś sie psuje na forum. Co minutę dostaję powiadomienie że jest nowa odpowiedź w tym temacie. I tak od godziny.

0

Właśnie sa prowadzone prace nad powiadomieniami.

0

Dopiero teraz to działa:


#include <stdio.h>
int main (void)
{
    char* marka = "Opel";
    char* model = "Astra";
    printf("Witamy w pierwszym programie! \n\n");
    printf("Moj samochod to: %s\n", marka);
    printf("Model to %s\n", model);
    char* typ = "Sedan";
    printf("Typ karoserii to %s\n", typ);
    printf("Samochod %s %s %s to dobre autko \n\n\n", marka, model, typ);
    char* nowy = "Insignia";
    printf("Od tej chwili moj nowy Opel to %s \n\n\n", nowy);

    nowy = "nowszy";
    char *nowszy = "Insignie V6\n\n\n";**
    printf("Teraz Insignie zmienilem na : %s\n\n", nowszy);

    nowszy = "stary";
    char *stary = "Ford";
    printf ("A teraz wrocilem do starego auta: %s\n\n", stary);

    stary = marka;
    printf ("A teraz Ford powinien zmienic sie na Opel i jest: %s\n\n", marka);

return 0;
}

Najpierw trzeba zmienić nazwę funkcji i w CodeBlocks nie działa char* nowy = "nowszy" lecz:

    nowy = "nowszy";
    

Dopiero wtedy deklaruję wartość tej funkcji:

char *nowszy = "Insignie V6\n\n\n";

i dopiero teraz działa.
Gdy zrobiłem:

char nowy = "nowszy";
char *nowszy = "Insignie V6\n\n\n";

lub

char *nowy = "nowszy";
char *nowszy = "Insignie V6\n\n\n";

nie działało.

title

2

Najpierw trzeba zmienić nazwę funkcji i w CodeBlocks nie działa char* nowy = "nowszy" lecz: nowy = "nowszy";

Nie działa wszędzie, ponieważ próbowałbyś tworzyć drugi raz obiekt o nazwie nowy zamiast zmienić wartość już utworzonego. W jednym zakresie próba utworzenia dwóch obiektów o tej samej nazwie zawsze skończy się niepowodzeniem. Jeżeli więc wcześniej napisałeś char *nowy = "cos", to nie możesz w tym samym zakresie napisać char *nowy = "drugi cos". I tutaj nie chodzi o żadną funkcję tylko o przypisanie wartości obiektowi. Funkcje to zupełnie co innego np: printf czy scanf to funkcje.

Natomiast dlaczego poniższy kod Ci nie działa było już tłumaczone.

// UB
char nowy = "nowszy";
char *nowszy = "Insignie V6\n\n\n";

// Nie działało, ponieważ wcześniej miałeś już utworzony obiekt char *nowy
// Należało po prostu przypisać nową wartość do wskaźnika zamiast tworzyć drugi raz ten sam obiekt.
char *nowy = "nowszy";
char *nowszy = "Insignie V6\n\n\n";

Przykłady:

2

To co robisz delikatnie mówiąc nie ma sensu.

Nie chodziło przypadkiem o coś takiego?

#include <stdio.h>

const char* brands[] = { "Fiat", "Opel", "Ford" };
const char* models[] = { "Seicento", "Astra", "Insignia", "Mustang", "Insignia V6" };
const char* types[] = { "Sedan", "SUV" };

void PrintCurrent( const char* brand, const char* model, const char* type )
{
	if ( !brand || !model || !type ) { return; }
	printf( "Current car is %s %s %s\n", brand, model, type );
}

int main( void )
{
	const char* curr_brand = brands[ 1 ];
	const char* curr_model = models[ 1 ];
	const char* curr_type = types[ 0 ];
	puts( " ---------- PROGRAM ---------- " );
	PrintCurrent( curr_brand, curr_model, curr_type );
	puts( "\t\t(zmiana modelu na Insignie" );
	curr_model = models[ 2 ];
	PrintCurrent( curr_brand, curr_model, curr_type );
	puts( "\t\t(zmiana na Insignie V6)" );
	curr_model = models[ 4 ];
	PrintCurrent( curr_brand, curr_model, curr_type );
	puts( "\t\t(zmiana na Forda Mustanga)" );
	curr_brand = brands[ 2 ];
	curr_model = models[ 3 ];
	PrintCurrent( curr_brand, curr_model, curr_type );
	return 0;
}
0

Tak, to prawda, jeszcze nie jestem na tym etapie o którym mówi Grzesiek ale spokojnie, po weekendzie pewnie już na nim będę.
Mam małą prośbę, tak bym się nie kręcił.
Mógł by ktoś zmodyfikować mój kod i namazać w nim zmianę wartości utworzonych char w 2,3 zakresach ?
Rozumiem że zakresami będą klamry {} ?
Rozumiem też że operacje na zmiennych między zakresami są jak najbardziej możliwe, tak?

0

To o co prosisz jest kompletnie bez sensu, ponieważ poza klamrami wskaźnik będzie miał starą wartość gdyż będą to dwa różne od siebie obiekty: http://ideone.com/WtfsbR
Uwierz mi, że na pewno nie o to Ci chodzi.

Zmienna o tej samej nazwie w zakresie swoim zakresie przesłania zmienną spoza zakresu.

0

Może głupi przykład zapodam ale w głowie widzę to tak.
Program zaczyna pracę i zczytuje wyniki z zewnątrz np. dane z procesora Atmela. Jedną z tych danych jest informacja o zewnętrznej temperaturze. Na razie pominę elektronikę bo to bez sensu teraz ale danymi dla programu będzie informacja 0 lub 1 (0=zimno, 1=ciepło).

W drugiej części programu będzie sterowanie np. diodką LED. Program na bazie pierwszego wyniku (zmiennego jak widać) będzie włączał lub wyłączał diodkę.
Mówiąc w uproszczeniu: wyświetli na ekran ZIMNO lub CIEPŁO ...

Chodzi mi o to by uzależnić pierwszą sekcję programu od drugiej a później w kolejnych sekcjach kolejne ...

sekcja1:
czytam info o temperaturze = wynik 0

sekcja2:
jeśli wynik 0 = wyświetl ZIMNO i wykonaj sekcję 5 programu
jeśli wynik 1 = wyświetl CIEPŁO i wykonaj sekcję 10 programu

sekcja5:
zamknij szyby
włącz ogrzewanie

sekcja10:
otwórz szyby
wyłącz ogrzewanie

Chciał bym też by kolejna część programu w przyszłości miała dostęp do wszystkich sekcji bez względu na ich wynik!
Przypuśćmy:

sekcja30:
sprawdź czy szyby są zamknięte = idź do sekcji 5 i podbierz sam wynik bez wykonywania tej operacji!

Kurczę, nakręciłem ale mam nadzieję że zrozumiecie :-)

0

Poczytaj o instrukcjach warunkowych: if... else.

0

No właśnie doczłapałem się do tego działu przed chwilą, if/else/goto więc poczytam i odezwę się jutro jak trochę zmądrzeję. Może jutrzejszy dzień będzie "jaśniejszy".

0

O goto z miejsca zapomnij. Nie używać, chyba, że chcesz wrócić do lat... nawet nie 80tych :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1