Using form_set_value() in Drupal 7 I am trying to update a value during the validate phase of a node-form, i.e. if the custom validation error is fired, just empty one of the fields. 

for the last 30 hours I am trying to make sense of the drupal api, but I am giving up. I just do not seem to get the idea what the different values mean. 

the function is: form_set_value($element, $value, &amp;$form_state)

now i understand that the last value is simply the $form_state, that I am having through the validate function. but what about $element and $value?

I was trying a lot and apparently the desired value resides in $form['field_name']['und'][0]['value']['#value'] and only there. 

but when I am trying form_set_value($form['field_name']['und'][0]['value']['#value'],'foo',$form_state) it raises 

    Recoverable fatal error: Argument 2 passed to drupal_array_set_nested_value() must be an array, string given, called in /includes/form.inc on line 2436 and defined in drupal_array_set_nested_value()


and when I am trying:

    $newvalue = $form['field_name']['und'][0]['value'];
    $newvalue['#value']='foo';
    form_set_value($form['field_name']['und'][0]['value'],$newvalue,$form_state);


it raises:

    Warning: mb_strlen() expects parameter 1 to be string, array given in drupal_strlen()


Thanks for any help!

[EDIT]

My complete function is: 

    function hook_node_validate($node,$form,&amp;$form_state) {
      if(fancy_stuff){
        form_set_value();
        form_set_error();
      } 
    }


[EDIT2]

    //calls when node is being created
    function eventcheck_node_validate($node,$form,&amp;$form_state) {
      //checks if the node type is applicable
      if($node -&gt; type=='article') {
        //checks if field 'field_event_choose' AND either 'field_event_title' 
        //or 'field_event' is supplied, if so, fire form_set_value() and form_set_error()
        if ((array_key_exists('endpoints',$node -&gt; field_event_choose['und'][0])) &amp;&amp; 
        (($node -&gt; field_event_title['und'][0]['value']&lt;&gt;'') || (isset($node -&gt; 
        field_event['und'][0]['value'])))) {

          //fire away
          $form_set_value(???);
          $form_set_error('event_checker_group',t('sorry blabla'));

        }
      }
    }


I hope that helps.
After a lot of debugging, I finally managed to make this work. The trick lies inside $form['complete form']. but first things first, how does form_set_value() work and what does it do?

The form_set_value() function

As the documentation suggests: 


  If you want to update the value of $form['elem1']['elem2'], which should be stored in $form_state['values']['elem1']['elem2'], you would set $element['#parents'] = array('elem1','elem2').


Now what does that mean? In my case, I had a textfield called 'field_event_title', which is the name I gave it on creation. In $form, all fields have a sub-array in $form['field_name'], which in my case is $form['field_event_title']. This is where the submitted value also is stored. Since it is a textfield, Drupal maintains both the language and the delta [question for editors: is this right?] of the input data. So in fact, the value is not stored in $form['field_name']['value'], but in $form['field_name']['und'][0]['value'] (['und']=language; [0]=delta). Note that "und" is the Drupal key for the default language of the site; if it is in German, then it would be "de"; however, in most cases it should be "und." 

To actually change the value using form_set_value(), one is ought to invoke the function by writing:

form_set_value($form['field_name'], array('und' =&gt; array(0 =&gt; array('value' =&gt; 'foo'))), $form_state);


Updating a form to repopulate it with different values than submitted (or clearing them)

Thus far, this was what Krister Andersson suggested, but that did not work in my case, since I wanted to clear fields once a custom validation error has been invoked. One would suspect that the form repopulates itself using the values inside $form_state['values'] (which is actually the place where the values are stored, the actual place that gets updated when using form_set_value() and the place which generates the $form later), but that is not the case: It uses the values inside $form_state['complete form'], which is a 'copy' of $form (notice that it is spelled 'complete form', with a space, not an underscore). 

Using $form_state['complete form']['field_name']['und'][0]['value']['#value'] = 'foo'; is what updates the values that actually repopulate the form on a validation error. (Note: you can, as do I in my usecase, set it to =NULL to simply empty the field.)

Summary

Where is the difference between $form['field_name'] (e.g. updating through form_set_value()) and $form['complete form']? Well, the former updates the actual value, which then gets stored inside the database; the latter is being used to repopulate a form when it failed a validation.