İlk olarak, func
düzeltilebilseyim (kaynağını değiştirmesine izin verilir), ardından düzeltin. Hesaplamaları işaretçilerle yapılıyorsa, bunları işaretçilerle ve dönüş işaretçileriyle yapın. Bazen, adreslerle tamsayı olarak çalışmak için geçerli nedenler vardır (ör. Özel kodda hizalama sorunlarını ele alma). Bu durumda, uintptr_t
türünü (stdint.h
numaralı belgede tanımlanmış) kullanmak için func
'u değiştirin. Gerekli olduğunda işaretleyicileri tamsayı olarak işlemek için tasarlanmıştır. (İmzalanmış bir aritmetik herhangi bir nedenle daha iyi ise intptr_t
da vardır, ancak genellikle imzasız uintptr_t
daha az sorunlu buluyorum.) Tercihen, func
, döndürürken bir işaretçi için uintptr_t
dönüştürmelidir, bu nedenle func
dönüş türü bir işaretçi (belki de some_struct
veya void
için).
func
düzeltemiyorsanız, derleyiciye gerçekleştirilmekte olan dönüştürmeleri yapmayı planladığını söylemek için yayınları kullanabilirsiniz. Ancak, bu belirli hata iletisi, yalnızca bir tamsayıyı bir işaretçiye dönüştürmediğinizi, ancak bir boyuttaki bir tamsayıyı (örneğin, dört bayt) başka bir boyuttaki bir göstericiye (ör., Sekiz bayt) dönüştürdüğünüzü bildirmektedir. Bu kod ilk olarak func
tarafından döndürülen tamsayı türünün işaretçi türü ile aynı boyuta sahip olduğu bir sistem için yazılmıştır, ancak şimdi işaretçi türünün tamsayı boyutundan daha büyük veya daha küçük olduğu bir sistem üzerinde derleme yapıyorsunuzdur. Bu durumda, func
tarafından gerçekleştirilen hesaplamaların yeni mimaride çalıştığından emin olmalısınız. Sadece 32 bitlik bir değer döndürüyorsa, her zaman doğru değeri koruyacak mı? Yani, eksik olan 32 bitlik hiçbir şey kaybolacak mı? func
'un hesaplaması gereken adres, kullandığı tamsayı türünün maksimum değerini geçmez mi? func
işaretli tamsayı türleri kullanıyorsa, işaret biti de düşünün.
func
tarafından döndürülen değerin doğru olduğundan emin olmanız durumunda, some_struct *ptr = (some_struct *) (intptr_t) func();
gibi açık yayınları kullanabilirsiniz.
Neden bir tamsayı bir struct işaretçisine yerleştirmek istersiniz? – Jay
Mümkün, ancak bunun doğru yoldan gitmesinin gerektiği durumlar nadirdir. –
"çıkış" farklılıklarının aşırı yüklenmesi var mı? (Giriş parametreleri değil) –