Şimdiye kadar benim boş gösterici hakkındaki yorumum aşağıdaki gibidir.
Bir işaretçi değişkeni void anahtar sözcüğü kullanılarak bildirildiğinde - genel amaçlı bir işaretçi değişkeni haline gelir. Herhangi bir veri türündeki herhangi bir değişkenin adresi (char, int, float vb.) Bir void gösterici değişkenine atanabilir.
main()
{
int *p;
void *vp;
vp=p;
}
Diğer veri türü işaretçisi void işaretçisine atanabildiğinden, onu absolut_value (aşağıda gösterilen kod) işlevinde kullandım. Genel bir işlev yapmak için.
Argüman olarak tamsayı veya kayan sayı alan ve negatifse + ve yapmaya çalışan basit bir C kodu yazmaya çalıştım. Aşağıdaki kodu yazdım,
#include<stdio.h>
void absolute_value ( void *j) // works if used float, obviously it must work but thats not my interest here.
{
if ( *j < 0 )
*j = *j * (-1);
}
int main()
{
int i = 40;
float f = -40;
printf("print intiger i = %d \n",i);
printf("print float f = %f \n",f);
absolute_value(&i);
absolute_value(&f);
printf("print intiger i = %d \n",i);
printf("print float f = %f \n",f);
return 0;
}
Ama hata alıyordum, bu yüzden boşluk göstericiyle olan anlayışımın doğru olmadığını anladım :(. Şimdi puan toplamaya doğru ilerleyeceğim neden böyle?
Boşluk işaretçilerinde daha fazla anlamam gereken şeyler bu.
Bunu kaldırmak için void işaretçi değişkenini yazmamız gerekir. Bunun nedeni, bir geçersiz göstericinin kendisiyle ilişkilendirilmiş hiçbir veri türüne sahip olmamasıdır. Derleyicinin, geçersiz gösterici tarafından hangi tür verilere işaret edildiğini bilmesinin (veya tahmin etmesini) hiçbir yolu yoktur. Dolayısıyla, bir boşluk gösterici tarafından işaret edilen veriyi almak için, onu boşluk işaretçileri konumunda tutulan doğru veri türü ile yazıyoruz.
void main()
{
int a=10;
float b=35.75;
void *ptr; // Declaring a void pointer
ptr=&a; // Assigning address of integer to void pointer.
printf("The value of integer variable is= %d",*( (int*) ptr) );// (int*)ptr - is used for type casting. Where as *((int*)ptr) dereferences the typecasted void pointer variable.
ptr=&b; // Assigning address of float to void pointer.
printf("The value of float variable is= %f",*( (float*) ptr) );
}
Programcı, son kullanıcı tarafından girilen veri tipinden emin değilse, bir boşluk gösterici gerçekten yararlı olabilir. Böyle bir durumda programcı, bilinmeyen veri tipinin konumuna işaret etmek için bir boş gösterici kullanabilir. Program, kullanıcıdan veri tipini bildirmesini isteyecek şekilde ayarlanabilir ve kullanıcı tarafından girilen bilgilere göre tip ataması yapılabilir. Aşağıda bir kod parçası verilmiştir.
void funct(void *a, int z)
{
if(z==1)
printf("%d",*(int*)a); // If user inputs 1, then he means the data is an integer and type casting is done accordingly.
else if(z==2)
printf("%c",*(char*)a); // Typecasting for character pointer.
else if(z==3)
printf("%f",*(float*)a); // Typecasting for float pointer
}
Boşluk işaretçileriyle ilgili aklınızda bulundurmanız gereken bir diğer önemli nokta da - işaretçi aritmetiği bir boşluk göstericide gerçekleştirilemez.
void *ptr;
int a;
ptr=&a;
ptr++; // This statement is invalid and will result in an error because 'ptr' is a void pointer variable.
Artık hatamın ne olduğunu anladım. Ben de aynısını düzeltiyorum.
Referanslar :
http://www.antoarts.com/void-pointers-in-c/
http://www.circuitstoday.com/void-pointers-in-c .
Yeni kod aşağıda gösterildiği gibidir.
#include<stdio.h>
#define INT 1
#define FLOAT 2
void absolute_value ( void *j, int *n)
{
if ( *n == INT) {
if ( *((int*)j) < 0 )
*((int*)j) = *((int*)j) * (-1);
}
if ( *n == FLOAT ) {
if ( *((float*)j) < 0 )
*((float*)j) = *((float*)j) * (-1);
}
}
int main()
{
int i = 0,n=0;
float f = 0;
printf("Press 1 to enter integer or 2 got float then enter the value to get absolute value\n");
scanf("%d",&n);
printf("\n");
if( n == 1) {
scanf("%d",&i);
printf("value entered before absolute function exec = %d \n",i);
absolute_value(&i,&n);
printf("value entered after absolute function exec = %d \n",i);
}
if( n == 2) {
scanf("%f",&f);
printf("value entered before absolute function exec = %f \n",f);
absolute_value(&f,&n);
printf("value entered after absolute function exec = %f \n",f);
}
else
printf("unknown entry try again\n");
return 0;
}
Teşekkür ederim,