マンガでよめる痔のこと・薬のこと

今プログラミングと格闘中です。タイトルにもあるように「Lvalue required」とはどういう意味か教えてください。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

補足を拝見しました。


まず、if文ですが
if(day%7=5)
では無く
if(day%7==5)
とイコールを2つ書きましょう。
それからprint文ですが
printf("%d月%d日は、土曜日です。");
%dに対する表示したい値が入っていません。

ほかにも、コンパイルエラーに掛かる場所は有りますが、簡単に直せるとこでしょうから、あえて記述致しません。
    • good
    • 0
この回答へのお礼

=は発見できたのですがその他のご指摘までありがとうございます。その他の部分も修正しています。はやく完成させたいです。

お礼日時:2001/01/25 14:15

Lvalueは左辺値の事ですね。



if分の式が代入になっていて、その代入式の左側。通常なら変数があるべき部分に day%7 って書いてあるから『代入するには左辺値が必要です』って言ってるんですね。

コンパイラって律儀なのでたまに変なエラーが出たりしますが、よくエラーの意味を考えると「なるほど」ってなります。
「絶対に間違ってない」って思いながら見てるとバグは見つかりません。「絶対になんか違ってるんだ」って疑ってかかると見えてくる場合が多いです。
    • good
    • 1
この回答へのお礼

エラーの修正をしてみると「なるほど」と思うことが多いですね。なかなか見つけられないこともあるので注意してみます。

お礼日時:2001/01/25 14:18

言語がなんなのか分からないので想像ですが


Left value required
左辺値が必要
と言われてるんじゃないでしょうか?
代入式の左辺(=の左側、代入されるほうです)が無いか
代入不可能なものが記述されているのでは?

この回答への補足

どうやら「=」が足りないような気がしました。今度はundefined symboやら
declaration syntax errorなどがでてきてしまいました ( >_<)。あぁ情けないです (T.T)。

補足日時:2001/01/24 20:25
    • good
    • 0

パラメータ(Lvalue)が異常だよぉ



 って言っていると思います。

 OSは?
 コンパイルの種類は?
 コンパイルエラーになるのなら、コンパイルエラーがでる部分を補足して下さいね。

 

この回答への補足

今カレンダー表示をさせようとしています。それでここまできたのですが、

#include <stdio.h>
main()
{
int i,dayi,month;
int dates[]={31,28,31,30,31,30,31,31,30,31,30,31};

printf(" 月を入力してください → ");
scanf("%d",&month);
printf(" 日を入力してください → ");
scanf("%d",&day);

for(i=0;i<monthi-1;i++){
day=day+dates[i];

if(day%7=0){
printf("%d月%d日は、日曜日です。");
}
if(day%7=1){
printf("%d月%d日は、月曜日です。");
}
if(day%7=2){
printf("%d月%d日は、火曜日です。");
}
if(day%7=3){
printf("%d月%d日は、水曜日です。");
}
if(day%7=4){
printf("%d月%d日は、木曜日です。");
}
if(day%7=5)
printf("%d月%d日は、金曜日です。");

if(day%7=6){
printf("%d月%d日は、土曜日です。");
 }

}
とまだまだできは遠そうです。しかしif文の位置が違っているのでしょうか。ifの文がすべてエラーだと出てしまうのです。

補足日時:2001/01/24 20:07
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QCのプログラムがどうしても動きません

Cを勉強中なのですが、以下のプログラムがうまくいきません。
(studentは構造体で定義した型です。)


iが0でない5の倍数の時にreallocでメモリを増やそうと思ったのですが、
「21行目」(reallocの行)で記述エラーを発見しました。
「lvalue」を付け忘れています。
と表示されます。

どこが間違っているのでしょうか?教えてくださいm(_ _)m


#include<stdio.h>

typedef struct{
char name[20];
int year;
char sex[6];
}student;


void read_data(int,student*);
void write_data(int,student*);

int main(void){
student data[5];
int i=0,j=0;

do{
read_data(i,data);
i++;
if(i%5==0 && i!=0){
data=realloc(data,(sizeof(student))*(i+5));
}
}while(data[i-1].year!=-1);

}
for(j=0;j<i-1;j++){
write_data(j,data);
}
free(heap);
return 0;
}

void read_data(int i,student *data){
printf("%d人目\n",i);
printf("名前?\n",i);
scanf("%s",(data[i].name));
printf("年齢?\n",i);
scanf("%d",&(data[i].year));
printf("性別?\n",i);
scanf("%s",(data[i].sex));
return;
}
void write_data(int j,student *data){
printf("%d人目\t",j+1);
printf("名前:%s\n",data[j].name);
printf("年:%d\n",data[j].year);
printf("性:%s\n",data[j].sex);
return;
}

Cを勉強中なのですが、以下のプログラムがうまくいきません。
(studentは構造体で定義した型です。)


iが0でない5の倍数の時にreallocでメモリを増やそうと思ったのですが、
「21行目」(reallocの行)で記述エラーを発見しました。
「lvalue」を付け忘れています。
と表示されます。

どこが間違っているのでしょうか?教えてくださいm(_ _)m


#include<stdio.h>

typedef struct{
char name[20];
int year;
char sex[6];
}student;


void read_data(int,student*);
void write_data(int,student*);

int ma...続きを読む

Aベストアンサー

reallocはmallocやcallocで確保した領域を拡張するときに使うものです。
配列は拡張できません。
配列自体に = で代入することもできません

> 「lvalue」を付け忘れています。
わからないなら、エラーは正確に書きましょう。
「lvalue required as left operand of assignment」とかじゃないですか?
配列dataは代入や変更のできない右辺値(rvalue)で、代入や変更のできるlvalue(左辺値)ではない、ということです。


あと、{}の数間違えてませんか?
free(heap); も heapなんて変数は使われてませんが

QC言語のポインターに関する警告

line[100]で
「1」が格納されていたら「a」
「2」が格納されていたら「b」
「3」が格納されていたら「c」
とout[100]に代入する関数を作りたいのですが
コンパイルすると関数の部分で
warning: assignment makes integer from pointer without a cast
という警告がでます。
ポインターは使っていないのですが、ポインターに関する警告が出ているようで困っています。
どこが悪いのかまったくわからなくて作業が完全に止まってしまいました。
解決法をおしえてください。お願いします。

/*宣言*/
int=i; /*main関数内のfor文で使用*/
char line[100], out[100];
void change(int);

/*関数*/
void change(int i)
  {
   if(line[i]=='1'){
    out[10]="a\0"
   }if(line[i]=='2'){
    out[10]="b\0";
   }if(line[i]=='3'){
    out[10]="c\0"
}
}

line[100]で
「1」が格納されていたら「a」
「2」が格納されていたら「b」
「3」が格納されていたら「c」
とout[100]に代入する関数を作りたいのですが
コンパイルすると関数の部分で
warning: assignment makes integer from pointer without a cast
という警告がでます。
ポインターは使っていないのですが、ポインターに関する警告が出ているようで困っています。
どこが悪いのかまったくわからなくて作業が完全に止まってしまいました。
解決法をおしえてください。お願いします。

/*宣言*/
int...続きを読む

Aベストアンサー

>    out[10]="a\0"
>    out[10]="b\0";
>    out[10]="c\0"

"a\0"や"b\0"や"c\0"は「charへのポインタ」ですよ。

out[10]は「char」ですから「記憶域が小さい整数(つまり、charに)に、ポインタを代入すると、値が失われるぞ」と警告が出ます。

void change(int i)
  {
   if(line[i]=='1'){
    out[10]='a';
   }if(line[i]=='2'){
    out[10]='b';
   }if(line[i]=='3'){
    out[10]='c';
}
}
または
void change(int i)
  {
   if(line[i]=='1'){
    out[10]=0x61; /* aのASCIIコード */
   }if(line[i]=='2'){
    out[10]=0x62; /* bのASCIIコード */
   }if(line[i]=='3'){
    out[10]=0x63; /* cのASCIIコード */
}
}
と書きましょう。

>    out[10]="a\0"
>    out[10]="b\0";
>    out[10]="c\0"

"a\0"や"b\0"や"c\0"は「charへのポインタ」ですよ。

out[10]は「char」ですから「記憶域が小さい整数(つまり、charに)に、ポインタを代入すると、値が失われるぞ」と警告が出ます。

void change(int i)
  {
   if(line[i]=='1'){
    out[10]='a';
   }if(line[i]=='2'){
    out[10]='b';
   }if(line[i]=='3'){
    out[10]='c';
}
}
または
void change(int i)
  {
   if(l...続きを読む

Qint型からchar型への変換

タイトル通り、int型からchar型への変換の仕方がわかりません!><
どうしたらいいのでしょうか?

Aベストアンサー

#include <stdio.h>


char buf[5];
int no;

no = 10;
sprintf(buf, "%d", no);

Qc言語プログラミング実行時エラーについて質問です。

c言語プログラミングを実行しようとすると、
エラーが出て次のようなメッセージが出てしまいました。
「「7行目」で記述エラーを発見しました。「constant expression」を付け忘れています。」

どなたか原因を教えてください。よろしくお願いいたします。

以下が失敗したプログラムです。
#include <stdio.h>

int main(int argc, const char * argv[]) {
const char FILENAME[] = "/Users/user/Desktop/date3.txt";
const int LEN = 100;
char line [LEN];
char name [LEN];
char birth [LEN];
char address [LEN];
FILE *dat;


dat = fopen(FILENAME, "r");
if ( dat == NULL ) {
printf(" ファイル %s がオープンできません. ", FILENAME);
return -1;
}
while( fgets( line, LEN, dat) != NULL ) {
sscanf( line "%s, %s, %s", name ,birth, address );
printf("name = %s, address = %s\n", name, address );
}
fclose(dat);


return 0;
}

c言語プログラミングを実行しようとすると、
エラーが出て次のようなメッセージが出てしまいました。
「「7行目」で記述エラーを発見しました。「constant expression」を付け忘れています。」

どなたか原因を教えてください。よろしくお願いいたします。

以下が失敗したプログラムです。
#include <stdio.h>

int main(int argc, const char * argv[]) {
const char FILENAME[] = "/Users/user/Desktop/date3.txt";
const int LEN = 100;
char line [LEN];
char name [LEN];
char birth [LEN];
char address [...続きを読む

Aベストアンサー

実行時エラーではなく、コンパイル時のエラーですね。

とりあえず環境(OSやコンパイラ)くらいは書きましょう。

現状で思いつくのはコンパイラが
自動変数の配列の要素数に定数以外を書くことに対応してないのではないかと思います。

char line[LEN /* ここが変数はダメ */];

GNU CコンパイラやC99対応のCコンパイラなら大丈夫なのですが。

Qコンパイルエラーに出てくる、identifierてなんですか?

Javaでコンパイルすると、よく 
<identifier> がありません。
というエラーが出ますが、このidentifierというのは、主に何を指すのでしょうか?

具体的でも、抽象的でも良いので、誰か教えてください。

Aベストアンサー

Javaの事はよくわからないので、検索してみたのですがお役に立てるでしょうか?
http://www.y-adagio.com/public/standards/tr_javalang/9.doc.htm
上のほうの「9.1インタフェース宣言」と言うところを読んでみてください。

Qgcc: incompatible pointer type

以下のCソースでコンパイルすると、warning: passing arg 1 of `func_b' from incompatible pointer type
となります。
void (*p_func)() は、引数を省略しているので int として扱われるということでしょうか?

#include <stdio.h>
#include <stdlib.h>
void func_a( unsigned char x ){
printf( "x=%d\n", x ) ;
}
void func_b( void (*p_func)() ){
p_func( 1 ) ;
}
int main(){
func_b( func_a ) ;
return 0 ;
}

Aベストアンサー

まずは訂正から。

「関数や関数へのポインタを宣言するときに仮引数リストを空にすると、仮引数はないものとして扱われます。」と書きましたが、今の C の規格では
「関数を定義するときに仮引数リストを空にすると、仮引数はないものとして扱われます。これに対し、関数の(定義ではない)宣言や関数へのポインタの宣言(定義を含む)の場合には、引数の個数や型について一切情報が与えられないことを意味します。」くらいに解釈されます。将来的には変更されるはずですが。

今の場合 void (*p_func)() となっているので「p_func は void を返す関数で、その引数の個数や型は不明」ということになります。

ではなぜ unsigned char や unsigned short のときには warning が出るのに int や char * や long では出るのかという点に移るのですが、これはおそらく過去との互換性だと思います。ANSI/ISO C 以前、つまりいわゆる K&R の時代にはプロトタイプ宣言が存在しませんでした。この時代、char 及び short の引数は int に、また float の引数は double に自動的に変更されていました。つまり、関数の仮引数として char、short、float は許されていませんでした。

今考えている例では p_func に引数の情報が与えられていないため、その引数として char、short 及び float は許されず、その結果これらの型を持つ仮引数があるような関数を渡そうとすると warning が出るのだと思います。

まずは訂正から。

「関数や関数へのポインタを宣言するときに仮引数リストを空にすると、仮引数はないものとして扱われます。」と書きましたが、今の C の規格では
「関数を定義するときに仮引数リストを空にすると、仮引数はないものとして扱われます。これに対し、関数の(定義ではない)宣言や関数へのポインタの宣言(定義を含む)の場合には、引数の個数や型について一切情報が与えられないことを意味します。」くらいに解釈されます。将来的には変更されるはずですが。

今の場合 void (*p_func)() となっ...続きを読む

Qセグメンテーション違反

C言語を使用しています。

構造体に値をいれようとしたら、コンパイルは出来るのですが、実行時に
「セグメンテーション違反です (core dumped)」
となってしまい、それ以上行えません。

構造体と代入したい変数との型は、合っています。

いろいろ本などで見ましたが、何が原因かわからず困っています。
教えてください。
宜しくお願いします。

Aベストアンサー

OSは何でしょうか。コンパイラは何を使用していますか?
通常、デバッグオプションをつけて実行すると、異常の発生したソースの箇所で止まりますので、それが手がかりになります。またNo1の方が言われてますように、ソースが公開できるのであれば、ソースを提示するのが良いかと思います。

Q複数桁10進数の*桁目だけを抽出したい

タイトルがすべてと言えてしまうのですが、
例えば、int宣言された"4287"(この値は変動します)という数値があったとして、1桁目の"7"だけを別の変数へ引き抜きたいのですが、その場合にはANDによるマスク処理による演算で処理可能なのでしょうか?
また、他に良い方法などありましたら教えていただけますでしょうか?

Aベストアンサー

★10進数ですので AND は使えませんね。
・簡単なサンプルを載せますので読み取って下さい。

サンプル1:
int value = 4287;
int a[ 4 ];

a[0] = (value % 10); value /= 10; // 1桁目を取り出す
a[1] = (value % 10); value /= 10; // 2桁目を取り出す
a[2] = (value % 10); value /= 10; // 3桁目を取り出す
a[3] = (value % 10); value /= 10; // 4桁目を取り出す

サンプル2:
int value = 4287;
int a;

a = (value % 10);
value -= a;

value → 4280
a → 7
になります。

Qコンパイルエラー invalid operands to binary

自己啓発で入力文字列をBASE64デコードする関数を作っているのですが、L20~L23(a[0] = strchr(b64, p[0]) - b64;)でコンパイルエラーinvalid operands to binaryが発生して色々試行錯誤しているのですが、どうしてもエラーがとれません。
ソースをここに書くのは大変恐縮なのですが、原因がわかる方がいらっしゃいましたら、教えていただけないでしょうか?

char *Base64n(unsigned char *buf, size_t length, size_t *outlen)
{
const char b64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrst         uvwxyz0123456789+/=";
unsigned char *p;
unsigned char *q;
unsigned char a[4];
char *RtnBuf;
int j=0;
int cnt;

RtnBuf = (char *)malloc(length+1);
memset(RtnBuf, 0, length+1);

p = (unsigned char*)buf;
q = (unsigned char*)RtnBuf;
cnt = 0;
while(*p != 0) {
a[0] = a[1] = a[2] = a[3] = 0;
a[0] = strchr(b64, p[0]) - b64;
a[1] = strchr(b64, p[1]) - b64;
a[2] = strchr(b64, p[2]) - b64;
a[3] = strchr(b64, p[3]) - b64;

q[0] = ((a[0] << 2) | (a[1] >> 4)) & 0xff;
cnt++;

if (p[2] != '=') {
q[1] = ((a[1] << 4) | (a[2] >> 2)) &0xff;
cnt++;
}
if (p[3] != '=') {
q[2] = ((a[2] << 6) | a[3]) & 0xff;
cnt++;
}
p += 4;
q += 3;
}
*outlen = cnt;
return(RtnBuf);
}

コンパイルはRed Hatでgccを使ってコンパイルしています。
引数は第1引数がデコード対象の文字列、第2引数がデコード対象文字列長、第3引数がデコード後の文字列長で、戻り値がデコード後の文字列です。

自己啓発で入力文字列をBASE64デコードする関数を作っているのですが、L20~L23(a[0] = strchr(b64, p[0]) - b64;)でコンパイルエラーinvalid operands to binaryが発生して色々試行錯誤しているのですが、どうしてもエラーがとれません。
ソースをここに書くのは大変恐縮なのですが、原因がわかる方がいらっしゃいましたら、教えていただけないでしょうか?

char *Base64n(unsigned char *buf, size_t length, size_t *outlen)
{
const char b64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrst ...続きを読む

Aベストアンサー

手元にgccが無いので、Windowsのbcc32でコンパイルしてみたところ、
エラーが出ずに通ってしまいました。
だから自信がないのですが…。

a[0] = strchr(b64, p[0]) - b64;



a[0] = strchr(b64, p[0]) - b64[0];

に変えてみたらどうでしょう。
"invalid operands to binary"
は、たぶん、マイナスの両側で型が違っていることを
表しているのではないでしょうか。(←これも自信なし)
strchr()が返すのはchar *型ですが、
b64の型は、charの配列型です。
型が違うので、コンパイラが不正と判断したのかもしれません。

とするとbcc32でなぜ通ったかが問題になるのですが…。
C言語規格でも、ポインタ同士の引き算のところは
ややこしくなっています。
規格解釈の違いがあるのかもしれません。

Qfgetsで拾われる改行文字を削除したい

お世話になります

 C言語初心者のものです。今課題でC言語を用いたプログラミングを
Fedora上でやっています。問題は、fgetsでテキストファイルから、取得
した文字列の中から改行文字を削除できないことです。文字変数のアド
レスはわかっているのですが、終端文字に置換しようとすると、セグメ
ントエラーになってしまいます。これは如何にして解決すべきでしょう
か。よろしくお願いします。

Aベストアンサー

ポインタとかアドレスとか、C言語の用語としてあるものを別の意味に使うとまぎらわしいです。

「ポインタ」「アドレス」と言われたら、 この例なら str, str+i が思い浮びます。
「文字変数のアドレス」だと
char c ;
に対しての
&c
が思い浮びます。

配列なら「添字」、意味的には「x文字目」ですね。

> for(i=0;;i++){
> if(*(str+i)=='/n') {
> *(str+i)='\0';
> break;
> }
> }
/nが\nの間違いなら、この方法で半分正解です。もう少し広い範囲(可能なら全体)で見ないことにはなんとも言えません。
fgetsが最大文字数に達したり、ファイルの最後になったりで、strに改行文字が含まれない場合には、このループは止まりません(Segmentension Falutになって止まる)

・そのような状態になってないか、予めチェックする
・ループを終了させる仕組みを用意しておく
: forの終了条件を記述する、for中で if(*(str+i)=='\0') { break;} 等としておく、等
といった対策が必要です。


あと細かいところを言えば
・strを配列で用意したなら *(s+i)じゃなくてs[i]でいいんじゃないかな
・あるいは char *pみたいにしておいて、 iのループでなく pでループを組む( for(p=str;*p!='\0';p++) )とか。

ポインタとかアドレスとか、C言語の用語としてあるものを別の意味に使うとまぎらわしいです。

「ポインタ」「アドレス」と言われたら、 この例なら str, str+i が思い浮びます。
「文字変数のアドレス」だと
char c ;
に対しての
&c
が思い浮びます。

配列なら「添字」、意味的には「x文字目」ですね。

> for(i=0;;i++){
> if(*(str+i)=='/n') {
> *(str+i)='\0';
> break;
> }
> }
/nが\nの間違いなら、この方法で半分正解です。もう少し広い範囲(可能なら全体)で見ないことにはなんとも言えません。
fgetsが...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング