質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

1654閲覧

Error cast from struct to 'uint32_t' {aka 'unsigned int'} loses precision

Programmer_FP

総合スコア1

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2022/08/07 15:04

C言語初心者です。
g++でのC言語のコンパイルが以下のエラーによってうまくいきません。
添付コードの最後の
return (uint32_t)flash_env;
でcast from 'FlashEnv*' {aka '_flash_env*'} to 'uint32_t' {aka 'unsigned int'} loses precision [-fpermissive]
というエラーが出ます。
あるC applicationのtutorialを行うことが目的でこのコード以外にも同じエラーが多数発生しています。
お力添えいただければ幸いです。

発生している問題・エラーメッセージ

cast from 'FlashEnv*' {aka '_flash_env*'} to 'uint32_t' {aka 'unsigned int'} loses precision [-fpermissive]

該当のソースコード

C

1 2#ifndef LINUX_APP 3 4#include <stdio.h> 5#include <stdlib.h> 6 7#include "xparameters.h" 8#include "xil_printf.h" 9#include "xiicps.h" 10#include "sleep.h" 11#include "xstatus.h" 12 13#define IIC_SCLK_RATE 400000 ///< I2C clock rates 14#define FLASH_MAX_LENGTH 256 ///< Maximum flash transfer length 15 16typedef struct _flash_env { 17 uint16_t slave_addr; ///< Slave address 18} FlashEnv; 19uint32_t fnInitFlash(uintptr_t addr, uint16_t slave_addr) 20{ 21 XIicPs_Config *pCfgPtr; 22 int Status; 23 24 FlashEnv *flash_env = (FlashEnv *)malloc(sizeof(FlashEnv)); 25 if (flash_env < 0) { 26 return XST_FAILURE; 27 } 28 29 flash_env->slave_addr = slave_addr; 30 31 //avoid multiple initializations 32 if (fIicPSInit) 33 goto iic_init_done; 34 35 //extract configuration pointer 36 pCfgPtr = XIicPs_LookupConfigBaseAddr(addr); 37 if (!pCfgPtr) { 38 xil_printf("No config found for %X\n", addr); 39 return -1; 40 } 41 42 //apply configuration to the Iic pointer 43 Status = XIicPs_CfgInitialize(&XIicPS, pCfgPtr, pCfgPtr->BaseAddress); 44 if (Status != XST_SUCCESS) { 45 xil_printf("Initialization failed %X\n"); 46 return -1; 47 } 48 49 //set the desired clock rate 50 XIicPs_SetSClk(&XIicPS, IIC_SCLK_RATE); 51 52iic_init_done: 53 return (uint32_t)flash_env; 54}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

C の言語仕様には「処理系定義」という概念が含まれます。 言語仕様では決めないから他の規定と矛盾しない範囲で処理系 (コンパイラ) の都合で決めてよいとされている部分があるのです。

ポインタの大きさもまた処理系定義であるにもかかわらず提示されたコードはポインタが 32bit の大きさであると決め打ちして書かれています。 おそらく質問者の使っている処理系はポインタが 64bit の大きさを持つものなのでしょう。 64bit の大きさを持つポインタを 32bit の整数に変換しようとして精度が失われる (loses precision) というエラーになっています。

C は低レイヤ向けにも使われるため、ハードウェアの事情に合わせやすいように言語仕様に幅が持たせられています。 想定と違う環境に持ってくると素直にコンパイルできないのは頻繁にあります。 正直言ってかなり頻繁にあります。 うんざりするほど頻繁にあるのですが、前提となるハードウェアや OS が違うので仕方がないですね。

投稿2022/08/07 17:28

SaitoAtsushi

総合スコア5444

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

ポインタが 32 bit であることを前提としたコードのようなので、対処は2通りあります。

  • ポインタが 32 bit 以外でも動くようにコードを書き換える。問題の関数の返り値の型を uint32_t から uintptr_t に変更します。返り値を利用しているコードもあちこち変更する必要があるでしょう。

  • 32 bit モードでビルドします。Linux 環境のようなので、コンパイルオプションとして -m32 を追加してください。いろいろと追加でインストールする必要があるかもしれません。

投稿2022/08/08 01:01

int32_t

総合スコア20882

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ポインタからuint32_tにはキャストできない、とおっしゃってます。
loses precision って出てるってことは、お使いの環境では、ポインタは32ビット以上のサイズを持ってるものと思われますが、そこらへん確認してみよう

投稿2022/08/07 23:04

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問