Mam taki problem przepisuje skrypt php na język c i tam jest użyta funkcja isset i jaki jest odpowiednik tej funkcji w języku c ?
Zależy od kontekstu.
Wrzuć fragment z PHP.
function porownaj($text1,$text2) {
$ilosc_zmakow_1 = strlen($text1);
$ilosc_zmakow_2 = strlen($text2);
$prawidlowa = 0;
$ilesc_znakoe_najwiekszego_stringa = "";
if ($ilosc_zmakow_1 > $ilosc_zmakow_2) $ilosc_znakow_najwiekszego_stringa = $ilosc_zmakow_1;
else $ilosc_znakow_najwiekszego_stringa = $ilosc_zmakow_2;
for ($i = 0;$i < $ilosc_znakow_najwiekszego_stringa;$i++) {
if (isset($text1[$i]) and isset($text2[$i]) and $text1[$i] != $text2[$i]) $prawidlowa--;
else if (isset($text1[$i]) and isset($text2[$i]) and $text1[$i] == $text2[$i]) $prawidlowa++;
}
$wynik = ($ilosc_zmakow_1 + $ilosc_zmakow_2) / 2;
//print $prawidlowa;
$wynik2 = $prawidlowa / $wynik;
//if ($wynik2[0] == "-" and $wynik2[1] == "0") print "dobrzde";
return $wynik2;
}
nie ma, mozesz napisac sobie
bool isSet(tutajTwojTyp obiekt)
{
return obiekt != NULL;
}
@fasadin: takie coś niekoniecznie musi działać jeżeli np. programista zapomniał zainicjalizować wskaźnik przez NULL
albo przemielenie obiektu przez jakąś libkę zwraca śmieci zamiast NULL
. Ot. osobliwości C. :-)
@pol90: https://stackoverflow.com/questions/230687/counterpart-of-phps-isset-in-c-c Tak naprawdę musisz zmienić trochę myślenie podchodząc do C, bo wiele rzeczy działa tam inaczej niż w PHP i czasami robienie czegoś identycznie jak w kodzie PHP nie ma sensu. Nawet co do Twojego fragmentu kodu; w C nie ma stringa jako takiego tylko cstring i standardowa libka do sprawdzania co w nim siedzi.
@pol90: ten kod będzie wyglądał mniej więcej tak (abstrahując od tego co ma robić):
#include<stdio.h>
#include<string.h>
double porownaj(const char* pierwszy, const char* drugi) {
if (pierwszy != NULL && drugi != NULL)
{
int ilosc_znakow_pierwszego = strlen(pierwszy);
int ilosc_znakow_drugiego = strlen(drugi);
int prawidlowa = 0;
int ilosc_znakow_najwiekszego_stringa = 0;
if (ilosc_znakow_pierwszego > ilosc_znakow_drugiego)
ilosc_znakow_najwiekszego_stringa = ilosc_znakow_pierwszego;
else
ilosc_znakow_najwiekszego_stringa = ilosc_znakow_drugiego;
int i = 0;
for (; i < ilosc_znakow_najwiekszego_stringa; ++i)
{
if (pierwszy[i] == '\0' || drugi[i] == '\0')
break;
if (pierwszy[i] != drugi[i]) --prawidlowa;
else if (pierwszy[i] == drugi[i]) ++prawidlowa;
}
double wynik = (ilosc_znakow_pierwszego + ilosc_znakow_drugiego) / 2.0;
double finalny_wynik = prawidlowa / wynik;
return finalny_wynik;
}
return -1;
}
int main()
{
printf("%f\n", porownaj("grzesiek", "grzesiek"));
printf("%f\n", porownaj("grzesiak", "grzesiek"));
return 0;
}
Zwraca mi następujące błędy
poronywanie.c:33:8: error: conflicting types for ‘porownaj’
double porownaj(const char* pierwszy, const char* drugi) {
^
poronywanie.c:17:18: note: previous implicit declaration of ‘porownaj’ was here
printf("%f\n", porownaj("grzesiek", "grzesiek"));
^
poronywanie.c: In function ‘porownaj’:
poronywanie.c:48:9: error: ‘for’ loop initial declarations are only allowed in C99 or C11 mode
for (int i; i < ilosc_znakow_najwiekszego_stringa; ++i)
Jak widzisz działa prawidłowo: https://ideone.com/d1HMxy
Może pokaż co masz w swoim kodzie (w całym pliku, bo wiem, że masz też mój kod na pewno).
@pol90: Taka inicjalizacja w pętli for
sprzed C99 jest nieprawidłowa for (int i; i < ilosc_znakow_najwiekszego_stringa; ++i)
Zresztą abstrahując od C99 także jest nieprawidłowa :)